hdu 2066 一个人的旅行(SPFA算法)

来源:互联网 发布:mac jdk1.7 下载 编辑:程序博客网 时间:2024/05/21 22:55

本题链接:点击打开链接

本题大意:

        输入T,S,D,表示有T条边,S个起点,D个终点;每条边输入两个点及边权,然后输入起点和终点;本题关键是有多个起点,从而求最短距离不好求,可采取相应方法进行简化,将每个起点与另外的一个点连接,使其边权为0,这样即可使起点变成一个;然后比较到每个终点的距离即可。参考代码:

#include<stdio.h>#include<string.h>#include<queue>#include<algorithm>#define MAXN 10010#define MAXM 20020#define INF 0x3f3f3f3fusing namespace std;int head[MAXN];int mark[MAXN];int dis[MAXN];struct node{int from,to,val,next;};node edge[MAXM];int num;void getmap(int u,int v,int w){node e={u,v,w,head[u]};edge[num]=e;head[u]=num++;}void SPFA(int s){queue<int>q;memset(mark,0,sizeof(mark));memset(dis,INF,sizeof(dis));q.push(s);while(!q.empty()){int top=q.front();q.pop();mark[s]=1;dis[s]=0;for(int i=head[top];i!=-1;i=edge[i].next){int u=edge[i].to;if(dis[u]>dis[top]+edge[i].val){dis[u]=dis[top]+edge[i].val;if(!mark[u]){mark[u]=1;q.push(u);}}}}}int main(){int t,s,d,start,end;while(scanf("%d%d%d",&t,&s,&d)!=EOF){memset(head,-1,sizeof(head));num=0;int m=INF;for(int i=0;i<t;i++){int a,b,time;scanf("%d%d%d",&a,&b,&time);getmap(a,b,time);getmap(b,a,time);}for(int i=0;i<s;i++){scanf("%d",&start);getmap(0,start,0);getmap(start,0,0);}SPFA(0);for(int i=0;i<d;i++){scanf("%d",&end);m=min(m,dis[end]);}printf("%d\n",m);}return 0;}


 

0 0
原创粉丝点击