标签:key == python 最短路 顶点 for map visit turn
? 重点:dijkstra算法按层计算其余点到源点的最短距离,层层扩展。
? 利用dijkstra算法,可以找到图中源点到其余点的最短距离。而求解两点间最短路径,只需找到两点的最短距离和路径。因此只需要在dijkstra算法中增添一个判断语句即可得到两点间最短距离。
def dijkstra(adjoin_map, u, v):
'''给定一个图的邻接表M,两点u和v,该代码能返回两点间的最短路径和距离。
:param adjoin_map: {node: [(node1, weight), (node2, weight2)]}
:param u:
:param v:
:return: 损失
'''
if u == v:
return 0
cost_dct = {u: 0} # 与源点的最短距离
to_visited_set = {u} # 需要访问的集合
find_status = False
while not find_status:
# 每次迭代扩展一层节点
cur = to_visited_set.pop()
for adjoin, cost in adjoin_map[cur]:
# 计算最短距离
cost_after = cost_dct[cur] + cost
if adjoin in cost_dct.keys():
if cost_after < cost_dct[adjoin]: # 情况1:如果已访问且距离更短,则更新距离
cost_dct[adjoin] = cost_after
else: # 情况2:未访问,则加入
cost_dct[adjoin] = cost_after
to_visited_set.add(adjoin)
if adjoin == v: # 找到则跳出
find_status = True
break
if v in cost_dct.keys():
return cost_dct[v]
return None
若需要保存最短路径,则只需要增加一个字典,用来保存每个节点的前驱节点。
标签:key == python 最短路 顶点 for map visit turn
原文地址:https://www.cnblogs.com/vvlj/p/12398130.html