题目链接:http://poj.org/problem?id=2502
分析:
告诉一些地铁线路,从起点到终点,中途可以步行,可以坐地铁,找一条最短的路
主要是把图建立好,然后直接dijkstra或者floyd,因为速度不同,所以转化成求最短的时间
题目大致处理方法就是将每个地铁站点与相邻的站点用时先算出,然后再算各个点之间步行耗时,最后一个dijkstra。
*:scanf的返回值由后面的参数决定scanf("%d%d",&a,&b);
如果a和b都被成功读入,那么scanf的返回值就是2
如果只有a被成功读入,返回值为1
如果a和b都未被成功读入,返回值为0
如果遇到错误或遇到end of file,返回值为EOF.
且返回值为int型.
Sample Input 0 0 10000 1000 0 200 5000 200 7000 200 -1 -1 2000 600 5000 600 10000 600 -1 -1
Sample Output 21
**********************************************
1 #include<iostream> 2 #include<algorithm> 3 #include<cstdio> 4 #include<cstring> 5 #include<queue> 6 #include<stdlib.h> 7 #include<map> 8 #include<cmath> 9 10 using namespace std; 11 12 #define N 2500 13 #define INF 0x3f3f3f3f 14 15 double v1=40000.0/60,v2=10000.0/60; 16 double maps[N][N], dist[N]; 17 int vis[N], k=2;; 18 19 struct node 20 { 21 int x,y; 22 } p[N]; 23 24 node s,e; 25 26 double Len(node a,node b) 27 { 28 double x=a.x-b.x; 29 double y=a.y-b.y; 30 double len=sqrt(x*x+y*y); 31 return len; 32 } 33 34 void Init() 35 { 36 for(int i=0; i<N; i++) 37 { 38 for(int j=0; j<N; j++) 39 maps[i][j]=(i==j)?0:INF; 40 dist[i]=INF; 41 } 42 } 43 44 void dij() 45 { 46 int i,j; 47 48 for(i=0; i<k; i++) 49 dist[i]=maps[0][i]; 50 51 vis[0]=1; 52 53 for(i=0; i<k; i++) 54 { 55 double Min=INF; 56 int index=-1; 57 for(j=0; j<k; j++) 58 { 59 if(vis[j]==0&&Min>dist[j]) 60 { 61 Min=dist[j]; 62 index=j; 63 } 64 } 65 if(index==-1) break; 66 vis[index]=1; 67 68 for(j=0;j<k;j++) 69 if(dist[j]>maps[index][j]+dist[index]&&vis[j]==0) 70 dist[j]=maps[index][j]+dist[index]; 71 } 72 } 73 74 int main() 75 { 76 int x,y,f=0, i,j; 77 78 scanf("%d %d", &s.x,&s.y); 79 scanf("%d %d",&e.x,&e.y); 80 p[0]=s; 81 p[1]=e; 82 83 memset(vis,0,sizeof(vis)); 84 memset(maps,0,sizeof(maps)); 85 Init(); 86 87 dist[0]=0; 88 vis[0]=1; 89 90 while(scanf("%d %d",&x,&y)==2)/*/ 91 { 92 if(x==-1&&y==-1) 93 { 94 f=0; 95 continue ; 96 } 97 98 p[k].x=x; 99 p[k].y=y; 100 101 if(f==1) 102 maps[k][k-1]=maps[k-1][k]=min(maps[k][k-1], Len(p[k],p[k-1])/v1); 103 f=1; 104 k++; 105 } 106 for(i=0; i<k; i++) 107 for(j=0; j<k; j++) 108 maps[i][j]=maps[j][i]=min(maps[i][j], Len(p[i],p[j])/v2); 109 110 dij(); 111 112 printf("%.0f\n", dist[1]); 113 114 return 0; 115 }