浪里个浪(最短路)

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 }
View Code

 

posted @ 2017-07-16 16:13  happy_codes  阅读(209)  评论(0编辑  收藏  举报