题目1008:最短路径问题(SPFA算法)
问题来源
http://ac.jobdu.com/problem.php?pid=1008
问题描述
给定一个G(V,E)有向图,起点s以及终点t,求最短路径。
问题分析
典型的单源最短路径问题,可以有多种方法完成。代码中采用的是SPFA算法。
注意:这里面在相等的最短路径时,要去花费最小的那条,需要多比较一下。
另外,我写了一篇最短路径四大算法总结,请参考:http://www.cnblogs.com/AlvinZH/p/6789912.html
参考代码
// // Created by AlvinZH on 2017/4/29. // Copyright (c) AlvinZH. All rights reserved. // #include <iostream> #include <cstdio> #include <string> #include <queue> using namespace std; #define MAX 1010 #define INF 0x3f3f3f3f int dis[MAX];//dis[i]表示起点到i的最短距离 int cost[MAX];//cost[i]表示起点到i的花费 bool vis[MAX];//是否访问过点i struct node { int dis,cost; }map[MAX][MAX]; int n,m,a,b,d,p,s,t; void SPFA() { for(int i=1;i<=n;i++)//初始化 { dis[i]=INF; cost[i]=INF; vis[i]=false; } queue<int> q; q.push(s); dis[s]=0; cost[s]=0; vis[s]=true; while(!q.empty()) { int cur=q.front(); q.pop(); vis[cur]=false; for(int i=1;i<=n;i++) { if(map[cur][i].dis!=INF&&dis[i]>=dis[cur]+map[cur][i].dis) { dis[i]=dis[cur]+map[cur][i].dis; cost[i]=min(cost[i],cost[cur]+map[cur][i].cost); if(!vis[i]) { vis[i]=true; q.push(i); } } } } } int main() { while(~scanf("%d%d",&n,&m)&&n&&m) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { map[i][j].dis=INF; map[i][j].cost=INF; } for(int i=1;i<=m;i++) { scanf("%d%d%d%d",&a,&b,&d,&p); map[a][b].dis=map[b][a].dis=d; map[a][b].cost=map[b][a].cost=p; } scanf("%d%d",&s,&t); SPFA(); printf("%d %d\n",dis[t],cost[t]); } return 0; }
作者: AlvinZH
出处: http://www.cnblogs.com/AlvinZH/
本人Github:https://github.com/Pacsiy/JobDu
本文版权归作者AlvinZH和博客园所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.