其他分享
首页 > 其他分享> > 一个人的旅行 HDU-2066 (SPFA)

一个人的旅行 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