poj 2502(floyd)

题意: 从家到学校,可以步行,可以地铁,最少时间?典型的最短路径。

注意三点地方:

       一、每两点可达,即使没有地铁,也可以步行的;

       二、相邻地铁可达,不相邻不用管(即在同一条地铁线上的两个不相邻站台不用管);

       三、地铁线不一定是直的。(WA了好两次)

View Code
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cmath>
 4 using namespace std;
 5 #define inf 0x7ffffff
 6 #define eps 1e-8
 7 #define MIN(x,y) ((x)>(y)?(y):(x))
 8 
 9 int V;
10 struct node
11 {
12     double x,y;
13 }pos[210];
14 
15 double dis[210][210];//i->j最短时间
16 
17 void floyd()
18 {
19     for(int k=0;k<V;k++) 
20         for(int i=0;i<V;i++)
21             for(int j=0;j<V;j++)
22                 dis[i][j]=MIN(dis[i][j],dis[i][k]+dis[k][j]);
23 }
24 
25 double subwaydis(node a,node b)
26 {
27     double d=sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
28     return d/40.0;
29 }
30 
31 double walkway(node a,node b)
32 {
33     double d=sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
34     return d/10.0;
35 }
36 int main()
37 {
38     int x,y;
39     scanf("%d%d",&x,&y);
40     V=0;
41     pos[V].x=x/1000.0,pos[V++].y=y/1000.0;
42     scanf("%d%d",&x,&y);
43     pos[V].x=x/1000.0,pos[V++].y=y/1000.0;
44     for(int i=0;i<210;i++)
45         for(int j=0;j<210;j++)
46             if(i==j)
47                 dis[i][j]=0;
48             else
49                 dis[i][j]=dis[j][i]=inf;
50 
51     while(scanf("%d%d",&x,&y) != EOF)
52     {
53         int st=V;
54         while(x!=-1 && y!=-1)
55         {
56             pos[V].x=x/1000.0,pos[V++].y=y/1000.0;
57             scanf("%d%d",&x,&y);
58         }
59 
60         for(int i=st;i<V-1;i++)
61                 dis[i][i+1]=dis[i+1][i]=subwaydis(pos[i],pos[i+1]);
62     }
63     //cout<<V<<endl;
64     //for(int i=0;i<V;i++)
65     //    for(int j=0;j<V;j++)
66     //        cout<<"i="<<i<<" j="<<j<<" "<<dis[i][j]<<endl;
67     
68     for(int i=0;i<V;i++)
69         for(int j=0;j<V;j++)
70             if(fabs(dis[i][j]-inf)<=eps)
71                 dis[i][j]=walkway(pos[i],pos[j]);
72     floyd();
73     double ans=(dis[0][1]*60.0);
74     printf("%.0lf\n",(ans));
75     return 0;
76 }

 

原文地址:https://www.cnblogs.com/Missa/p/2661095.html