福州大学第十四届程序设计竞赛_重现赛 I

来源:互联网 发布:painter中文版mac 编辑:程序博客网 时间:2024/05/27 09:45

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 41 3 11 4 22 3 32 4 42 1 22 3 4
Sample Output
1

多源最短路,spfa直接入队即可

#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<iostream>#include<queue>#define mem(a,b) memset(a,b,sizeof(a))using namespace std;const int N=100005;int tot,first[N],dis[N],S,E,vis[N];struct data{    int v,next,w;} e[N<<1];void add_edge(int u,int v,int w){    e[tot].v=v;    e[tot].w=w;    e[tot].next=first[u];    first[u]=tot++;}void init(){    mem(dis,0x3f3f3f3f);    mem(first,-1);    mem(vis,0);    tot=0;}struct node{    int num,cost;    bool friend operator < (node a,node b)    {        return a.cost>b.cost;    }};void spfa(){    node a,b;    priority_queue<node>q;    int x;    scanf("%d",&S);    for(int i=1; i<=S; i++)    {        scanf("%d",&x);        dis[x]=0;        a.num=x;        a.cost=0;        q.push(a);        vis[x]=1;    }    while(!q.empty())    {        a=q.top();        q.pop();        vis[a.num]=0;        for(int i=first[a.num]; ~i; i=e[i].next)        {            if(dis[e[i].v]>dis[a.num]+e[i].w)            {                dis[e[i].v]=dis[a.num]+e[i].w;                if(!vis[e[i].v])                {                    vis[e[i].v]=1;                    b.num=e[i].v;                    b.cost=dis[e[i].v];                    q.push(b);                }            }        }    }}int main(){    int n,m,u,v,w,x;    while(~scanf("%d%d",&n,&m))    {        init();        for(int i=1; i<=m; i++)        {            scanf("%d%d%d",&u,&v,&w);            add_edge(u,v,w);        }        spfa();          scanf("%d",&E);          int minn=0x3f3f3f3f;          for(int i=1;i<=E;i++)          {              scanf("%d",&x);              minn=min(dis[x],minn);          }          printf("%d\n",minn);    }    return 0;}


阅读全文
0 0