浪里个浪(最短路)
Problem 2261 浪里个浪
Accept: 40 Submit: 106
Time Limit: 1500 mSec Memory Limit : 32768
KB
Problem Description
TonyY是一个喜欢到处浪的男人,他的梦想是带着兰兰姐姐浪遍天朝的各个角落,不过在此之前,他需要做好规划。
现在他的手上有一份天朝地图,上面有n个城市,m条交通路径,每条交通路径都是单行道。他已经预先规划好了一些点作为旅游的起点和终点,他想选择其中一个起点和一个终点,并找出从起点到终点的一条路线亲身体验浪的过程。但是他时间有限,所以想选择耗时最小的,你能告诉他最小的耗时是多少吗?
Input
包含多组测试数据。
输入第一行包括两个整数n和m,表示有n个地点,m条可行路径。点的编号为1 - n。
接下来m行每行包括三个整数i, j, cost,表示从地点i到地点j需要耗时cost。
接下来一行第一个数为S,表示可能的起点数,之后S个数,表示可能的起点。
接下来一行第一个数为E,表示可能的终点数,之后E个数,表示可能的终点。
0<S, E≤n≤100000,0<m≤100000,0<cost≤100。
Output
输出他需要的最短耗时。
Sample Input
4 4
1 3 1
1 4 2
2 3 3
2 4 4
2 1 2
2 3 4
Sample Output
1
Source
福州大学第十四届程序设计竞赛_重现赛//竟然直接最短路就能过,唉,还是做题太少!继续刷题
对于多个起点,就用一个特殊的不用的点用权为0的边连起来,从这点出发即可!
1 #include <stdio.h> 2 #include <iostream> 3 #include <string.h> 4 #include <algorithm> 5 #include <queue> 6 #include <set> 7 using namespace std; 8 #define INF 0x3f3f3f3f 9 #define MX 100005 10 11 struct Edge{ 12 int u,v,cost; 13 int nex; 14 }edge[MX]; 15 16 int n,m,S,E; 17 int r_m; 18 int headlist[MX]; 19 int end_e[MX]; 20 int vis[MX]; 21 int dis[MX]; 22 23 void add_edge(int u,int v,int c) 24 { 25 edge[r_m]=(Edge){u,v,c,headlist[u]}; 26 headlist[u]=r_m; 27 r_m++; 28 } 29 30 int spfa(int star) 31 { 32 queue<int> Q; 33 memset(vis,0,sizeof(vis)); 34 memset(dis,0x3f,sizeof(dis)); 35 Q.push(star); 36 vis[star]=1;dis[star]=0; 37 while(!Q.empty()) 38 { 39 int u = Q.front(); 40 Q.pop(); 41 vis[u]=0; 42 for (int i=headlist[u];i!=-1;i=edge[i].nex) 43 { 44 int v=edge[i].v,w=edge[i].cost; 45 if (dis[v]>dis[u]+w) 46 { 47 dis[v]=dis[u]+w; 48 if (!vis[v]) 49 { 50 Q.push(v); 51 vis[v]=1; 52 } 53 } 54 } 55 } 56 int ret=INF; 57 for (int i=0;i<n;i++) 58 { 59 if (end_e[i]&&dis[i]<ret) 60 ret = dis[i]; 61 } 62 return ret; 63 } 64 65 int main() 66 { 67 while (scanf("%d%d",&n,&m)!=EOF) 68 { 69 r_m=0; 70 memset(headlist,-1,sizeof(headlist)); 71 for (int i=0;i<m;i++) 72 { 73 int a,b,c; 74 scanf("%d%d%d",&a,&b,&c); 75 add_edge(a,b,c); 76 } 77 scanf("%d",&S); 78 for (int i=0;i<S;i++) 79 { 80 int x; 81 scanf("%d",&x); 82 add_edge(n+1,x,0); 83 } 84 scanf("%d",&E); 85 memset(end_e,0,sizeof(end_e)); 86 for (int i=0;i<E;i++) 87 { 88 int x; 89 scanf("%d",&x); 90 end_e[x]=1; 91 } 92 printf("%d\n",spfa(n+1)); 93 } 94 return 0; 95 }