本题链接:点击打开链接
本题大意:
输入n,m,s,代表有n个点,m条边,s代表终点。然后输入边,每条边输入p,q,t;p,q代表两个点,t表示边权,注意题目中说是从p指向q边,故应建立有向图。然后输入w表示有w个起点,然后输入起点;对于多个起点,如果对每个起点使用一次SPFA,则起点多的话可能会有点麻烦,所以不妨这样进行处理:另外设置一个不与题目中重合的点,将所有起点到此点的边权设为0,然后以此点为起点进行查找所找到的必然是最短的。具体请参考代码:
#include<stdio.h> #include<string.h> #include<queue> #define MAXN 1010 #define MAXM 40040 #define INF 0x3f3f3f3f using namespace std; int head[MAXN]; int dis[MAXN]; int mark[MAXN]; struct node{ int from,to,val,next; }; node edge[MAXM]; int num,n,m,s; 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); mark[s]=1; dis[s]=0; while(!q.empty()) { int top=q.front(); q.pop(); mark[top]=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() { while(scanf("%d%d%d",&n,&m,&s)!=EOF) { memset(head,-1,sizeof(head)); num=0; for(int i=0;i<m;i++) { int a,b,d; scanf("%d%d%d",&a,&b,&d); getmap(a,b,d); } int w,start; scanf("%d",&w); for(int i=0;i<w;i++) { scanf("%d",&start); getmap(0,start,0); } SPFA(0); if(dis[s]==INF) printf("-1\n"); else printf("%d\n",dis[s]); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdu 2680 Choose the best route (SPFA算法)
原文:http://blog.csdn.net/lsgbb/article/details/47802471