讨论 / 数据保存一位小数没错了。
席一鸣 2014-09-20 19:39:58
点我顶贴 收藏 删除
#include<cmath>

#include<cstdio>

#include<cstring>

#include<iostream>

using namespace std;

struct sb

{

int x,y,c;

}pos[2001];

bool b[201];

double d[101];

int n,tot,costf,st,ed,tc,x[5],y[5],costt[201];

double dis(int x,int y)

{

double k;

k=sqrt(pow(pos[x].x-pos[y].x,2)+pow(pos[x].y-pos[y].y,2));

if(pos[x].c==pos[y].c)

k*=costt[pos[x].c];

else

k*=costf;

return k;

}

double dij(int st)

{

double min,k;

int i,j,p;

memset(b,0,sizeof(b));

memset(d,100,sizeof(d));

d[st]=0;

for(i=1;i<=tot;i++)

{

min=1e38;

for(j=1;j<=tot;j++)

if(!b[j]&&d[j]<min)

{

min=d[j];

p=j;

}

b[p]=1;

for(j=1;j<=tot;j++)

if(!b[j])

d[j]=d[j]>d[p]+dis(p,j)?d[p]+dis(p,j):d[j];

}

k=1e38;

for(i=1;i<=tot;i++)

{

if(pos[i].c==ed)

for(j=0;j<=3;j++)

k=d[i+j]<k?d[i+j]:k;

if(pos[i].c==ed)

break;

}

return k;

}

main()

{

cin>>tc;

double min=1e38;

int i,j,k;

while(tc)

{

cin>>n>>costf>>st>>ed;

for(i=1;i<=n;i++)

{

cin>>x[1]>>y[1]>>x[2]>>y[2]>>x[3]>>y[3]>>costt[i];

for(j=1;j<=3;j++)

for(k=1;k<=3;k++)

if(j!=k&&(x[j]-x[k])*(x[6-k-j]-x[j])+(y[j]-y[k])*(y[6-k-j]-y[j])==0)

{

x[4]=x[k]+x[6-k-j]-x[j];

y[4]=y[k]+y[6-k-j]-y[j];

}

for(j=1;j<=4;j++)

{

pos[++tot].x=x[j];

pos[tot].y=y[j];

pos[tot].c=i;

}

}

for(i=1;i<=tot;i++)

{

if(pos[i].c==st)

for(j=0;j<=3;j++)

min=dij(i+j)<min?dij(i+j):min;

if(pos[i].c==st)

break;

}

printf("%.1lf",min);

tc--;

}

}

#1 Sentinel Prome@2015-08-11 05:52:43
回复 删除
struct sb 这句话亮了
查看更多回复
提交回复