hrbust1218 最短路 Car的旅行路线
(由于图片无法显示,链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1218)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 const int M=600; 6 const int INF=1<<28; 7 int c,n,a,b,x[M],y[M],t,ta; 8 double g[M][M]; 9 void swap(int *x,int *y) 10 { 11 int z; 12 z=*x;*x=*y;*y=z; 13 } 14 void init() 15 { 16 int s[5]; 17 for(int i=1;i<=4*n;i++) 18 for(int j=1;j<=4*n;j++) 19 g[i][j]=INF; 20 for(int i=1;i<=n;i++) 21 { 22 for(int j=1;j<=3;j++) 23 scanf("%d%d",&x[j],&y[j]); 24 scanf("%d",&ta); 25 s[1]=(x[2]-x[3])*(x[2]-x[3])+(y[2]-y[3])*(y[2]-y[3]); 26 s[2]=(x[1]-x[3])*(x[1]-x[3])+(y[1]-y[3])*(y[1]-y[3]); 27 s[3]=(x[2]-x[1])*(x[2]-x[1])+(y[2]-y[1])*(y[2]-y[1]); 28 if(s[3]==s[1]+s[2]) 29 { 30 swap(&x[1],&x[3]); 31 swap(&y[1],&y[3]); 32 } 33 else if(s[2]==s[1]+s[3]) 34 { 35 swap(&x[1],&x[2]); 36 swap(&y[1],&y[2]); 37 } 38 x[4]=x[2]+x[3]-x[1];y[4]=y[2]+y[3]-y[1]; 39 for(int j=1;j<=4;j++) 40 { x[i*4+j]=x[j];y[i*4+j]=y[j];} 41 for(int j=1;j<=4;j++) 42 for(int k=j;k<=4;k++) 43 { 44 int u=(i-1)*4,v=x[j]-x[k],w=y[j]-y[k]; 45 g[u+j][u+k]=sqrt(v*v+w*w)*ta; 46 g[u+k][u+j]=g[u+j][u+k]; 47 } 48 for(int j=1;j<=i-1;j++) 49 for(int k=1;k<=4;k++) 50 for(int p=1;p<=4;p++) 51 { 52 int u=(i-1)*4,v=(j-1)*4; 53 g[u+k][v+p]=sqrt((x[i*4+k]-x[j*4+p])*(x[i*4+k]-x[j*4+p])+(y[i*4+k]-y[j*4+p])*(y[i*4+k]-y[j*4+p]))*t; 54 g[v+p][u+k]=g[u+k][v+p]; 55 } 56 } 57 } 58 void floyd() 59 { 60 double min; 61 for(int k=1;k<=4*n;k++) 62 for(int i=1;i<=4*n;i++) 63 if(k!=i) 64 for(int j=1;j<=4*n;j++) 65 if(j!=i&& j!=k) 66 if(g[i][j]>g[i][k]+g[k][j]) 67 g[i][j]=g[i][k]+g[k][j]; 68 min=INF; 69 for(int i=1;i<=4;i++) 70 for(int j=1;j<=4;j++) 71 if(g[(a-1)*4+i][(b-1)*4+j]<min) 72 min=g[(a-1)*4+i][(b-1)*4+j]; 73 printf("%0.1lf\n",min); 74 } 75 int main() 76 { 77 while(scanf("%d%d%d%d",&n,&t,&a,&b)!=EOF) 78 { 79 init(); 80 floyd(); 81 } 82 }