HDU

题目链接: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
", dist[1]);
113 
114     return 0;
115 }
原文地址:https://www.cnblogs.com/weiyuan/p/5749228.html