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)

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值