您的位置:首页 > 其它

贪心算法之Bellman-Ford

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

算法如下:



算法的前面还是和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

这是我见过的比较简洁的代码,谢谢链接中的博主。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: