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 }

 

 

你可能感兴趣的:(floyd)