说明
迪克斯特拉算法,就是在图中,将某一点到达图中任意顶点的权值改变,变成最小的
完整代码
# coding=utf8
a, b, c, d, e, f = range(6)
G = {
a: {b: 2, c: 1, d: 4, f: 10}, # a
b: {a: 2, c: 4, e: 3}, # b
c: {a: 1, b: 4, d: 2, f: 8}, # c
d: {a: 4, c: 2, e: 1}, # d
e: {b: 3, d: 1, f: 7}, # e
f: {a: 10, c: 8, e: 7}, # f
}
import heapq
def djksttra(G, s):
# 迪克斯特拉
# python中利用float('inf')来刻画一个无穷大的数
inf = float('inf')
# 将每一个点的距设置为无穷大
D = {v: inf for v in G}
# 起始顶点到某一个顶点的距离
D[s] = 0
# 存放当前访问节点的父节点
P = {}
# 访问过的顶点放进一个结合,避免无限循环
S = {s}
# 当前访问的顶点
v = s
# 有先级队列
q = []
# 循环总共的顶点数的次数
for _ in range(len(G) - 1):
for u, w in G[v].iteritems():
# 计算从当前顶点到邻接顶点的距离
d = D[v] + G[u][v]
# 如果当前的距离大于从邻接顶点的距离则更新
if D[u] > d:
# 距离更新
D[u] = d
# 父顶点更新
P[u] = v
# 把当前的距离,子顶点添加到优先级队列
heapq.heappush(q, (w, u))
while q:
# 从优先级队列里弹出一个距离最小的子顶点
_, v = heapq.heappop(q)
if v not in S:
# 只有不在访问过的集合中,才能被访问
S.add(v)
break
else:
break
return D, P
D, P = djksttra(G, a)
print D, P