python 图 最小生成树

说明

没时间作解释了,下次写python

完整代码

# 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)