贪心算法之Bellman-Ford

前面都是边的权值是正的情况,如果一个图包含负权值的环,那么最短路径可能不存在。而Bellman-Ford算法:从源s∈V到所有v∈V找到所有的最短路径的长度或者检测是否有一个负环路存在。

算法如下:

《贪心算法之Bellman-Ford》

算法的前面还是和Dijkstra一样的,只是在后面多了一个检测负权环的for循环,即对所有的边松弛完毕后,开始检测如果d[v]>d[u]+w(u,v)任然存在那么显然有一个负权环

代码如下:

《贪心算法之Bellman-Ford》


 

# 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数据组织形式如下:

《贪心算法之Bellman-Ford》

两个数用Tab键隔开

以上转自:http://www.cnblogs.com/enyun/archive/2011/06/28/2092545.html

这是我见过的比较简洁的代码,谢谢链接中的博主。

 

 

    原文作者:Bellman - ford算法
    原文地址: https://blog.csdn.net/csy463168656/article/details/8128377
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞