贪心算法之Bellman-Ford
2012-10-30 14:49
519 查看
前面都是边的权值是正的情况,如果一个图包含负权值的环,那么最短路径可能不存在。而Bellman-Ford算法:从源s∈V到所有v∈V找到所有的最短路径的长度或者检测是否有一个负环路存在。
算法如下:
算法的前面还是和Dijkstra一样的,只是在后面多了一个检测负权环的for循环,即对所有的边松弛完毕后,开始检测如果d[v]>d[u]+w(u,v)任然存在那么显然有一个负权环
代码如下:
其中drg.data数据组织形式如下:
两个数用Tab键隔开
以上转自:http://www.cnblogs.com/enyun/archive/2011/06/28/2092545.html
这是我见过的比较简洁的代码,谢谢链接中的博主。
算法如下:
算法的前面还是和Dijkstra一样的,只是在后面多了一个检测负权环的for循环,即对所有的边松弛完毕后,开始检测如果d[v]>d[u]+w(u,v)任然存在那么显然有一个负权环
代码如下:
# This Python file uses the following encoding: utf-8 import sys lineNum=0 nodeNum=0 dist = [] pre = [] sourceNode = -1 dataFile = open('e:\\drg.data', 'r') [ nodeNum, sourceNode ] = dataFile.readline().split("\t") dataFile.close() print (nodeNum, sourceNode) nodeNum = int(nodeNum) sourceNode = int(sourceNode) - 1 dist = [10000 for i in range(nodeNum)] pre = [-1 for i in range(nodeNum)] dist[sourceNode] = 0 dataFile = open('e:\\drg.data', 'r') dataFile.readline() for line in dataFile.readlines(): #其实就是Dijkstra算法中的对边进行松弛 [frm, to, wei] = line.split("\t") frm = int(frm)-1 to = int(to)-1 wei = int(wei) if (dist[frm] + wei < dist[to]): dist[to] = dist[frm] + wei pre[to] = frm dataFile.close() for i in range(len(dist)): print (i, dist[i]) dataFile = open('e:\\drg.data', 'r') dataFile.readline() for line in dataFile.readlines(): #对负权环进行检测 [frm, to, wei] = line.split("\t") frm = int(frm)-1 to = int(to)-1 wei = int(wei) if (dist[frm] + wei < dist[to]): print ("Graph contains a neg-wei cycle") dataFile.close()
其中drg.data数据组织形式如下:
两个数用Tab键隔开
以上转自:http://www.cnblogs.com/enyun/archive/2011/06/28/2092545.html
这是我见过的比较简洁的代码,谢谢链接中的博主。
相关文章推荐
- Bellman_ford 算法 Currency Exchange POJ1860
- Bellman-ford 算法详解
- 单源最短路径算法 Bellman-Ford && SPFA 及 最短路算法统一归纳
- POJ 1860 Currency Exchange(如何Bellman-Ford算法判断图中是否存在正环)
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- 四种最短路径算法(Dijkstra,Floyd,Bellman-ford&&spfa)
- 最短路径问题--Bellman-Ford最短路径算法
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- Bellman-Ford算法分析
- Bellman-Ford算法介绍总结
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- URAL 1162 Currency Exchange (Bellman-Ford贝尔曼-福特算法)
- Bellman-ford算法判断有无负环
- 算法导论-----图论-----Bellman-ford 算法
- 最短路径算法—Bellman-Ford(贝尔曼-福特)算法分析与实现(C/C++)
- Bellman-Ford算法 单源最短路径(o(nm))
- Bellman-Ford算法详讲
- poj-2240-Arbitrage(Bellman-ford算法练习 + Floyd算法练习)
- 单源最短路径:Dijkstra 算法 Bellman_Ford 算法 SPFA 算法
- 最短路径 Floyd算法 Dijkstra算法 Bellman-Ford(贝尔曼)算法