Car 的旅行路线——去你的精度
不想说了……这是我刚刚提交在洛谷题解的代码。
1 #include<algorithm> 2 #include<iostream> 3 #include<cstdlib> 4 #include<cstring> 5 #include<string> 6 #include<vector> 7 #include<cstdio> 8 #include<stack> 9 #include<queue> 10 #include<cmath> 11 #include<map> 12 #include<set> 13 using namespace std; 14 const int N=512,M=0x7fffffff; 15 struct node{ 16 int x,y; 17 }ap[N];//机场坐标。 18 int n,air,sx,tx,cost[N];//城市数量,航线花费,起始城,终点城,各城公路花费。 19 double f[N][N],res=1e7;//Floyd使用的费用数组,答案。 20 double dist(int x,int y){ 21 return sqrt((double)((ap[x].x-ap[y].x)*(ap[x].x-ap[y].x)+(ap[x].y-ap[y].y)*(ap[x].y-ap[y].y))); 22 }//欧几里得距离。 23 int main(){ 24 int T;cin>>T; 25 while(T--){ 26 memset(f,0x3f,sizeof f); 27 cin>>n>>air>>sx>>tx;sx--;tx--; 28 for(int i=0;i<n;i++){ 29 int x1,y1,x2,y2,x3,y3,x4,y4,c; 30 cin>>x1>>y1>>x2>>y2>>x3>>y3>>c; 31 //下面三个if和else分别对应第四个点“对面”的点为1,2,3,的情况。判断“对面”点和计算第四点坐标皆使用向量。 32 if((x2-x1)*(y2-y1)+(x3-x1)*(y3-y1)==0) 33 x4=x2+x3-x1,y4=y2+y3-y1; 34 else if((x3-x2)*(y3-y2)+(x1-x2)*(y1-y2)==0) 35 x4=x1+x3-x2,y4=y1+y3-y2; 36 else 37 x4=x1+x2-x3,y4=y1+y2-y3; 38 cost[i]=c;ap[4*i]=(node){x1,y1};ap[4*i+1]=(node){x2,y2};ap[4*i+2]=(node){x3,y3};ap[4*i+3]=(node){x4,y4}; 39 } 40 41 for(int i=0;i<n*4;i++) 42 for(int j=0;j<n*4;j++) 43 f[i][j]=dist(i,j)*((i/4)==(j/4)?cost[i/4]:air);//初始化f数组,i/4==j/4代表i与j处于同一个城市,费用单价为cost[i/4](显然等价于cost[j/4]); 44 //否则不在同一城市,费用单价为航线花费。 45 46 for(int k=0;k<n*4;k++) 47 for(int i=0;i<n*4;i++) 48 for(int j=0;j<n*4;j++) 49 f[i][j]=min(f[i][j],f[i][k]+f[k][j]);//Floyd. 50 51 for(int i=0;i<4;i++) 52 for(int j=0;j<4;j++) 53 res=min(f[sx*4+i][tx*4+j],res);//最终答案是从起始城四个机场中任意一个到终点城四个机场中任意一个的最小花费。 54 55 printf("%.1lf\n",res); 56 } 57 return 0; 58 }
0ms

浙公网安备 33010602011771号