题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2066
题目大意:这是一个不同于其他最短路模板的题目,他特别的地方是起点不同,起点有不同个,来求到达终点的最短路。注意时间问题,以防超时~~
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <cmath> 6 using namespace std; 7 int n,Min,MM,map[1010][1010],d,node[1010],p[1010],q[1010]; 8 const int INF=999999; 9 10 void set () 11 { 12 for (int i=1; i<1010; i++) 13 { 14 node[i]=INF; 15 for (int j=1; j<1010; j++) 16 map[i][j]=INF; 17 } 18 } 19 20 int dijkstra(int m) 21 { 22 int vis[1010]= {0}; 23 int tm=m; 24 vis[m]=1; 25 node[m]=0; 26 for (int k=2; k<=n; k++) 27 { 28 Min=INF; 29 for (int i=1; i<=n; i++) 30 if (!vis[i]) 31 { 32 if (node[i]>map[tm][i]+node[tm]) 33 node[i]=map[tm][i]+node[tm]; 34 if (Min>node[i]) 35 { 36 Min=node[i]; 37 m=i; 38 } 39 } 40 vis[m]=1; 41 tm=m; 42 for (int j=1; j<=d; j++) 43 if (q[j]==tm) 44 return Min; 45 } 46 return -1; 47 } 48 49 int main () 50 { 51 int T,s; 52 while (~scanf("%d%d%d",&T,&s,&d)) 53 { 54 //cout<<d<<endl; 55 set(); 56 n=0; 57 //cout<<d<<endl; 58 while (T--) 59 { 60 int a,b,t; 61 scanf("%d%d%d",&a,&b,&t); 62 //cout<<1<<endl; 63 if (a>n) 64 n=a; 65 else if (b>n) 66 n=b; 67 if (map[a][b]>t) 68 map[a][b]=map[b][a]=t; 69 } 70 for (int i=1; i<=s; i++) 71 scanf("%d",&p[i]); 72 for (int j=1; j<=d; j++) 73 scanf("%d",&q[j]); 74 MM=INF; 75 for (int i=1; i<=s; i++) 76 { 77 int w=dijkstra(p[i]); 78 if (MM>w&&w!=-1) 79 MM=w; 80 } 81 printf ("%d ",MM); 82 } 83 return 0; 84 }