HDU-2680-Choose the best route【spfa】

来源:互联网 发布:我知女人心迅雷下载 编辑:程序博客网 时间:2024/06/10 07:07


Sample Input
5 8 51 2 21 5 31 3 42 4 72 5 62 3 53 5 14 5 122 34 3 41 2 31 3 42 3 211
 
Sample Output
1-1


题目分析:输入n个车站,m条路线,t为终点,m行里分别是两个站点及他们之间的距离,输入s,s个可能的出发点。注意是单向边,且两个站点之间可能有多条路线,要选最短的那条。反着看,将终点看作起点。

#include<stdio.h>#include<string.h>#include<queue>#include<iostream>const int inf=999999999;using namespace std;int n,m,s,first[1010],cnt,dis[1010],vis[1010];struct node{int u,v,w,next;}e[20020];void add(int u,int v,int w){e[cnt].u=u;e[cnt].v=v;e[cnt].w=w;e[cnt].next=first[u];first[u]=cnt++;}void spfa(){int i;memset(vis,0,sizeof(vis));for(i=1;i<=n;i++){dis[i]=inf;}dis[s]=0;queue<int>q;q.push(s);vis[s]=1;while(!q.empty()){int u=q.front();q.pop();vis[u]=0;for(int i=first[u];i!=-1;i=e[i].next){int v=e[i].v;if(dis[v]>dis[u]+e[i].w){dis[v]=dis[u]+e[i].w;if(!vis[v]){vis[v]=1;q.push(v);}}}}}int main(){while(scanf("%d%d%d",&n,&m,&s)!=EOF){int i;memset(first,-1,sizeof(first));cnt=0;for(i=0;i<m;i++){int u,v,w;scanf("%d%d%d",&v,&u,&w);add(u,v,w);}spfa();int ans=inf,num;scanf("%d",&num);while(num--){int x;scanf("%d",&x);if(dis[x]<ans)ans=dis[x];}if(ans==inf)printf("-1\n");elseprintf("%d\n",ans);}return 0;}


#include<iostream>#include<cstring>#include<queue>using namespace std;const int inf=99999999; const int maxx=20001;int n,m,s;int first[maxx],nextt[maxx]; int u[maxx],v[maxx],w[maxx];int dis[maxx],vis[maxx];void spfa(){queue<int> q;    memset(vis,0,sizeof(vis));    for(int i=1;i<=n;i++){        dis[i]=inf;    }    dis[s]=0;    vis[s]=1;    q.push(s);    while(!q.empty()){    int cur=q.front();    q.pop();    vis[cur]=0;    for(int e=first[cur];e!=-1;e=nextt[e]){    if(dis[v[e]]>dis[cur]+w[e]){    dis[v[e]]=dis[cur]+w[e];    if(vis[v[e]]==0){    q.push(v[e]);vis[v[e]]=1;}} }}  }int main(){    while(scanf("%d%d%d",&n,&m,&s)!=EOF){        for(int i=1;i<=n;i++){        first[i]=-1;        nextt[i]=-1;        } for(int i=1;i<=m;i++){scanf("%d%d%d",&v[i],&u[i],&w[i]);nextt[i]=first[u[i]];first[u[i]]=i;}        spfa();       int ans=inf,num;scanf("%d",&num);while(num--){int x;scanf("%d",&x);if(dis[x]<ans)ans=dis[x];}if(ans==inf)printf("-1\n");elseprintf("%d\n",ans);  }  return 0;}