一个人的旅行 HDU-2066 (SPFA)
作者:互联网
http://acm.hdu.edu.cn/showproblem.php?pid=2066
Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间,可不能浪费啊,一定要给自己好好的放个假,可是也不能荒废了训练啊,所以草儿决定在要在最短的时间去一个自己想去的地方!因为草儿的家在一个小镇上,没有火车经过,所以她只能去邻近的城市坐火车(好可怜啊~)。 Input 输入数据有多组,每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个,草儿想去的地方有D个;接着有T行,每行有三个整数a,b,time,表示a,b城市之间的车程是time小时;(1=<(a,b)<=1000;a,b 之间可能有多条路)
接着的第T+1行有S个数,表示和草儿家相连的城市;
接着的第T+2行有D个数,表示草儿想去地方。 Output 输出草儿能去某个喜欢的城市的最短时间。 Sample Input 6 2 3 1 3 5 1 4 7 2 8 12 3 8 4 4 9 12 9 10 2 1 2 8 9 10 Sample Output 9
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <stack> 7 #include <vector> 8 9 const int inf = 0x3f3f3f3f; 10 11 using namespace std; 12 13 struct node 14 { 15 int v, w, next; 16 }edge[1000005]; 17 18 int head[1005], dis[1005], num[1005], tot; 19 bool vis[1005]; 20 21 void add(int u, int v, int w) 22 { 23 tot++; 24 edge[tot].v = v; 25 edge[tot].w = w; 26 edge[tot].next = head[u]; 27 head[u] = tot; 28 } 29 30 void init(int s) 31 { 32 for(int i=0;i<=1002;i++) 33 { 34 //num[i] = 0; 35 dis[i] = inf; 36 vis[i] = false; 37 } 38 dis[s] = 0; 39 } 40 41 bool spfa(int s, int t) 42 { 43 init(s); 44 queue <int> que; ///队列 45 que.push(s); 46 vis[s] = 1; 47 //num[s]++; 48 while(!que.empty()) 49 { 50 int cur = que.front(); 51 que.pop(); 52 vis[cur] = 0; 53 for(int i=head[cur];i;i=edge[i].next) 54 { 55 int v = edge[i].v; 56 if(dis[v]>dis[cur]+edge[i].w) 57 { 58 dis[v] = dis[cur] + edge[i].w; 59 if(!vis[v]) 60 { 61 que.push(v); 62 vis[v] = true; 63 //num[v]++; 64 //if(num[v] > t) return false; ///超过总边数,存在负环,(当然,这道题不存在这种情况,不写也可) 65 } 66 } 67 } 68 } 69 return true; 70 } 71 72 int main() 73 { 74 int t, s, d; 75 int city[1005], like[1005]; 76 while(~scanf("%d %d %d", &t, &s, &d)) 77 { 78 tot = 0; 79 while(t--) 80 { 81 int u, v, w; 82 scanf("%d %d %d", &u, &v, &w); 83 add(u, v, w); 84 add(v, u, w); 85 } 86 for(int i=0;i<s;i++) 87 { 88 scanf("%d", &city[i]); 89 } 90 for(int i=0;i<d;i++) 91 { 92 scanf("%d", &like[i]); 93 } 94 int minn = inf; 95 for(int i=0;i<s;i++) 96 { 97 spfa(city[i], t); 98 for(int j=0;j<d;j++) 99 { 100 minn = min(minn, dis[like[j]]); 101 } 102 } 103 printf("%d\n", minn); 104 } 105 106 return 0; 107 }
标签:HDU,草儿,int,tot,SPFA,edge,que,include,2066 来源: https://www.cnblogs.com/0xiaoyu/p/12856328.html