博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最短路径2
阅读量:6266 次
发布时间:2019-06-22

本文共 1661 字,大约阅读时间需要 5 分钟。

  这里我们再谈单源最短路径。在之前的博客中,我们了解到了求单源最短路径的迪杰斯特拉算法,但是需要指出的是,迪杰斯特拉算法是无法解决负权环问题的,因为很显然的是,存在负边权的有向图,随着update()操作最短路径将无限的变小。因此为了解决含负边权的最短路径问题,我们引入SPFA算法,该算法由段凡丁于1994年论文提出。有趣的是,据说在国际上SPFA这个名称并不被认可,关于其中的详情可以自行百度。

  其实spfa算法和迪杰斯特拉算法很相似,但是又有不同之处。以下为spfa的实现:

#include 
#include
using namespace std;const int MAXN = 100001;const int MAXM = 200001;const int INF = (1 << 31) - 1;struct Line { int p; int v; int next;};struct Node { int d; bool book;};Node node[MAXN];Line line[MAXM];int h[MAXN];int que[MAXN * 2];int n, m, s, x, y, v, head, tail, now;void add(int x, int y, int v, int lID) { line[lID].p = y; line[lID].v = v; line[lID].next = h[x]; h[x] = lID;}void spfa(int now) { int k = h[now]; int p; while(k) { p = line[k].p; if(node[p].d > (node[now].d + line[k].v)) { node[p].d = node[now].d + line[k].v; if(!node[p].book) { que[tail] = p; tail++; node[p].book = true; } } k = line[k].next; }}int main() { scanf("%d%d%d", &n, &m, &s); for(int i = 1; i <= m; i++) { scanf("%d%d%d", &x, &y, &v); add(x, y, v, i); } for(int i = 1; i <= n; i++) { node[i].book = false; node[i].d = INF; } node[s].d = 0; head = 1; tail = 1; que[tail] = s; node[s].book = true; tail++; while(head < tail) { now = que[head]; spfa(now); node[now].book = false; head++; } for(int i = 1; i <= n; i++) { printf("%d ", node[i].d); } return 0;}

  

 

  

  圆满完成。

转载于:https://www.cnblogs.com/potatorain/p/9459854.html

你可能感兴趣的文章
树线段hdu 1754 I Hate It(线段树)
查看>>
uva-297 Quadtrees
查看>>
java6枚举类型
查看>>
构造函数产生的点及原因
查看>>
对象、对象数组、JSON、JSON数组的相关操作
查看>>
lua(wax框架) 适配 64位操作系统
查看>>
css3和jquery实现的可折叠导航菜单(适合手机网页)
查看>>
POJ 1696 Space Ant(点积的应用)
查看>>
storyboard ID
查看>>
怎样用Google APIs和Google的应用系统进行集成(1)----Google APIs简介
查看>>
Leetcode: Number of Connected Components in an Undirected Graph
查看>>
Leetcode: Maximum Size Subarray Sum Equals k
查看>>
C#语言实现ArcGIS数据源重置之Set Data Source功能
查看>>
Codeforces Round #344 (Div. 2) A. Interview 水题
查看>>
Premiere Pro & After Effects插件开发调试方法
查看>>
墨西哥短暂生活杂谈
查看>>
第四篇:R语言数据可视化之折线图、堆积图、堆积面积图
查看>>
异步编程之Javascript Promises 规范介绍
查看>>
EnumRemarkAttribute,获取属性值
查看>>
GCC扩展(转--对看kernel代码有帮助
查看>>