bellman-ford算法求源点到任意点最短路径
一、算法流程
- 初始化所有的node节点。每个节点中存储从源点到达这个节点的距离,源点的值为0,其它的节点则为无穷大。
- 循环节点,遍历所有的有向边,对有向边进行松弛计算,不断逼近正确的路线。
- 遍历所有的有向边 edges(start,end)可能出现的路线情况,如果出现
dicts[edge[‘end’]]> dicts[edge[‘start’]] + edge[‘weight’] 的情况,表示存在负权回路的情况,如果存在负权回路的话,就会因为出现无法收敛而导致不能求出最短路径的情况。
二、代码实现过程(python)
定义算法类
class Bellman_ford():
def __init__(self,node_num:int,startedvertex:str):
self.edges = []
self.maxint = float('Inf')
self.dicts ={}
self.node_num = node_num
self.startedvertex = startedvertex
定义添加数据函数
def has_node(self,nodes):
for node in nodes:
if node not in self.dicts.keys():
self.dicts[node] = self.maxint
self.strList.append(node)
def add(self,start:str,end:str,weight:int):
self.has_node([start,end])
self.edges.append({
'start':start,
'end':end,
'weight':weight
})
定义初始化数据函数
def init(self):
for dict in self.dicts.keys():
self.dicts[dict] = self.maxint
self.dicts[self.startedvertex] = 0
for i in range(len(self.strList)):
for j in range(i):
if self.strList[i] < self.strList[j]:
temp = self.strList[i]
self.strList[i] = self.strList[j]
self.strList[j] = temp
开始计算最短边
def start(self):
flag = 'true'
for i in range(self.node_num-1):
for edge in self.edges:
if self.dicts[edge['end']] > self.dicts[edge['start']] + edge['weight']:
self.dicts[edge['end']] = self.dicts[edge['start']] + edge['weight']
temp = self.dicts.copy()
self.dictsList.append(temp)
for edge in self.edges:
if self.dicts[edge['end']] > self.dicts[edge['start']] + edge['weight']:
flag = 'false'
break
return {
'dictsList':self.dictsList,
'flag':flag
}
调用算法类
if __name__ == "__main__":
inp = input()
inplist = inp.split(';')
bf = None
for i in range(len(inplist)):
if i == 1:
bf = Bellman_ford(node_num=int(inplist[0]), startedvertex=inplist[1])
elif i > 1:
inpstr = inplist[i].split(',')
bf.add(start=inpstr[0],end=inpstr[1],weight=int(inpstr[2]))
bf.init()
rt = bf.start()
print(";".join(["%s" %bf.strList[i] for i in range(len(bf.strList))]))
for i in range(len(rt['dictsList'])):
print(";".join(["%s" % rt['dictsList'][i][bf.strList[j]] for j in range(len(bf.strList))]))
print(rt['flag'])