回顾下最短路径的地杰斯特拉算法
迪杰斯特拉算法是求从某一个起点到其余所有结点的最短路径,是一对多的映射关系,是一种贪婪算法
示例:
算法实现流程思路:
迪杰斯特拉算法每次只找离起点最近的一个结点,并将之并入已经访问过结点的集合(以防重复访问,陷入死循环),然后将刚找到的最短路径的结点作为中间结点来更新相邻结点的路径长度,这样循环找到图中一个个结点的最短路径。
# dists定义了图,记录着从从起点出发到其他顶点的距离
dist={1:{2:1,3:12},
2:{3:9,4:3},
3:{5:5},
4:{3:4,5:13,6:15},
5:{6:4},
6:{6:0}}
cost={1:0,2:1,3:12,4:999,5:999,6:999} # 由起点(结点1)到其余顶点的最短距离,999代表无法到达
parents={1:None,2:1,3:2,4:2,5:3,6:5} # parent代表到达这个结点的最短路径的前一个结点
visited=[1] # 起始结点默认已经访问过
# 找到还没有访问的结点中路径最短的一个结点
def findShorestNode(cost):
minDist=999
node=None
for i in dist.keys():
if (cost[i]<minDist)&(i not in visited):
minDist=cost[i]
node=i
return node
# 更新最短路径
node=findShorestNode(cost)
while node:
for i in dist[node]: # 所有node结点的邻居结点
newcost=cost[node]+dist[node][i]
if newcost<cost[i]:
parents[i]=node
cost[i]=newcost
visited.append(node)
node=findShorestNode(cost)
# 打印出从1到6的最短路径
parent=parents[6]
while parent:
print(parent)
parent=parents[parent]
结果: