贪心算法之Bellman-Ford

来源:互联网 发布:必佳预算软件下载 编辑:程序博客网 时间:2024/06/14 06:52

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

算法如下:

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

代码如下:


 

# This Python file uses the following encoding: utf-8import 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] = frmdataFile.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

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

 


 

原创粉丝点击