说明
没时间做解释了,下次写
完整代码
# coding=utf8
G = [
{5: 10, 1: 28}, # 0
{0: 28, 6: 14, 2: 16}, # 1
{1: 16, 3: 12}, # 2
{2: 12, 4: 22, 6: 18}, # 3
{3: 22, 5: 25, 6: 24}, # 4
{0: 10, 4: 25}, # 5
{1: 14, 3: 18, 4: 24} # 6
]
import heapq
def prim(G):
# 这个图的顶点个数,prim算法的边数就是顶点数减一
n = len(G)
# 从第一个顶点开始
v = 0
# 这个集合避免重复的顶点被重复执行,造成无限循环
s = {v}
# 存放边的值
edges = []
# 存放结果
res = []
for _ in range(n - 1):
# 对字典进行解包
for u, w in G[v].iteritems():
# hwapq优先级队列回自动弹出最小值,默认以元祖中第一个元素排序
# 所以第一个参数w代表权值,v,u表示两个顶点
heapq.heappush(edges, (w, v, u))
# 循环条件,只有当我们的边存在才会进行循环
while edges:
# 对优先级队列中的边进行拆包,拿出权值最小的那个边
w, p, q = heapq.heappop(edges)
# 在我们计算顶点的时候,要求顶点不全在我们的集合中,由于边的第一个顶点已经固定在集合中了
# 因此只需要要求第二个顶点不能在集合中
if q not in s:
# 访问一个顶点,就把这个顶点放进集合中
s.add(q)
# 把最小的边加入到我们的结果中
res.append(((p, q), w))
# 把下一个顶点作为起始顶点
v = q
# 然后推出这一次的顶点,操作下一个顶点
break
return res
print prim(G)