hrbust1218 最短路 Car的旅行路线

(由于图片无法显示,链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1218

View Code
 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 }

 

posted @ 2012-07-26 11:17  _sunshine  阅读(238)  评论(0编辑  收藏  举报