一个人的旅行 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个数,表示草儿想去地方。
接着有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
把每个城市当做起点,分别跑spfa:
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 memset(dis, inf, sizeof(dis)); 33 memset(num, 0, sizeof(num)); 34 memset(vis, false, sizeof(vis)); 35 dis[s] = 0; 36 } 37 38 bool spfa(int s, int t) 39 { 40 init(s); 41 queue <int> que; ///队列 42 que.push(s); 43 vis[s] = 1; 44 num[s]++; 45 while(!que.empty()) 46 { 47 int cur = que.front(); 48 que.pop(); 49 vis[cur] = 0; 50 for(int i=head[cur];i;i=edge[i].next) 51 { 52 int v = edge[i].v; 53 if(dis[v]>dis[cur]+edge[i].w) 54 { 55 dis[v] = dis[cur] + edge[i].w; 56 if(!vis[v]) 57 { 58 que.push(v); 59 vis[v] = true; 60 //num[v]++; 61 //if(num[v] > t) return false; ///超过总边数,存在负环,(当然,这道题不存在这种情况,不写也可) 62 } 63 } 64 } 65 } 66 return true; 67 } 68 69 int main() 70 { 71 int t, s, d; 72 int city[1005], like[1005]; 73 while(~scanf("%d %d %d", &t, &s, &d)) 74 { 75 tot = 0; 76 memset(head, 0, sizeof(head)); 77 for(int i=0;i<t;i++) 78 { 79 int u, v, w; 80 scanf("%d %d %d", &u, &v, &w); 81 add(u, v, w); 82 add(v, u, w); 83 } 84 for(int i=0;i<s;i++) 85 { 86 scanf("%d", &city[i]); 87 } 88 for(int i=0;i<d;i++) 89 { 90 scanf("%d", &like[i]); 91 } 92 int minn = inf; 93 for(int i=0;i<s;i++) 94 { 95 spfa(city[i], t); 96 for(int j=0;j<d;j++) 97 { 98 minn = min(minn, dis[like[j]]); 99 } 100 } 101 printf("%d\n", minn); 102 } 103 104 return 0; 105 }
或者直接把城市设成起点:
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 memset(dis, inf, sizeof(dis)); 33 memset(num, 0, sizeof(num)); 34 memset(vis, false, sizeof(vis)); 35 dis[s] = 0; 36 } 37 38 bool spfa(int s, int t) 39 { 40 init(s); 41 queue <int> que; ///队列 42 que.push(s); 43 vis[s] = 1; 44 num[s]++; 45 while(!que.empty()) 46 { 47 int cur = que.front(); 48 que.pop(); 49 vis[cur] = 0; 50 for(int i=head[cur];i;i=edge[i].next) 51 { 52 int v = edge[i].v; 53 if(dis[v]>dis[cur]+edge[i].w) 54 { 55 dis[v] = dis[cur] + edge[i].w; 56 if(!vis[v]) 57 { 58 que.push(v); 59 vis[v] = true; 60 //num[v]++; 61 //if(num[v] > t) return false; ///超过总边数,存在负环,(当然,这道题不存在这种情况,不写也可) 62 } 63 } 64 } 65 } 66 return true; 67 } 68 69 int main() 70 { 71 int t, s, d; 72 int city[1005], like[1005]; 73 while(~scanf("%d %d %d", &t, &s, &d)) 74 { 75 tot = 0; 76 memset(head, 0, sizeof(head)); 77 for(int i=0;i<t;i++) 78 { 79 int u, v, w; 80 scanf("%d %d %d", &u, &v, &w); 81 add(u, v, w); 82 add(v, u, w); 83 } 84 for(int i=0;i<s;i++) 85 { 86 scanf("%d", &city[i]); 87 } 88 for(int i=0;i<d;i++) 89 { 90 scanf("%d", &like[i]); 91 } 92 int minn = inf; 93 for(int i=0;i<s;i++) 94 { 95 spfa(city[i], t); 96 for(int j=0;j<d;j++) 97 { 98 minn = min(minn, dis[like[j]]); 99 } 100 } 101 printf("%d\n", minn); 102 } 103 104 return 0; 105 }