• 求最小生成树


    目录

    一、前言

    二、最小生成树

    1、上链接

    2、基本思路

    3、python代码(AC)


    一、前言

    再做做与图、树相关的题目,显然,用并查集能很完美地找出最小生成树,废话不多说,直接看题目。

    二、最小生成树

    1、上链接

    【模板】最小生成树 - 洛谷

    2、基本思路

    从权值最小的边开始依次“并”相应节点。

    3、python代码(AC)

    1. N,M=map(int,input().split())
    2. edges=[]
    3. for i in range(M):
    4. x,y,z=map(int,input().split())
    5. edges.append((x,y,z))
    6. edges.sort(key=lambda x:x[2],reverse=True)
    7. ##for i in range(M):
    8. ## print(edges[i])
    9. p=[i for i in range(N+1)]
    10. def union(x,y):
    11. p[Find(x)]=Find(y)
    12. def Find(x):
    13. if p[x]==x:
    14. return x
    15. p[x]=Find(p[x])
    16. return p[x]
    17. res=0
    18. cnt=1
    19. while edges:
    20. e=edges.pop()
    21. if Find(e[0])!=Find(e[1]):
    22. union(e[0],e[1])
    23. cnt+=1
    24. res+=e[2]
    25. if cnt==N:
    26. print(res)
    27. else:
    28. print("orz")

    这代码挺简单的,直接看便可看懂。该题我主要复习了列表的 sort 排序(其实可以在 IDLE 上测试观察的),还有 python 的匿名函数 lambda 的使用。

    以上,最小生成树例题

    祝好

     -------------------------------------------------------------------------------

    由于上文太短,发文助手机器人建议再加多点内容,好吧~

     -------------------------------------------------------------------------------

    1、生成树

    • 在图论中,如果连通图的一个子图是一棵包含的所有顶点的树,则该子图称为G的生成树 (SpanningTree)。

    • 生成树是连通图的包含图中的所有顶点的极小连通子图。

    • 图的生成树不唯一。从不同的顶点出发进行遍历,可以得到不同的生成树。

    通俗的来说,生成树就是:

    • 只要能连通所有顶点而又不产生回路的任何子图都是它的生成树
    • 连接图中所有的点n,并且只有n-1条边的子图就是它的生成树

    2、最小生成树

    自行体会。

    3、kruskal算法

    Kruskal 算法是能够在 O(mlogm) 的时间内得到一个最小生成树的算法。它主要是基于贪心的思想:

    ① 将边按照边权从小到大排序,并建立一个没有边的图 T。

    ② 选出一条没有被选过的边权最小的边。

    ③ 如果这条边两个顶点在 T 中所在的连通块不相同,那么将它加入图 T, 相同就跳过。

    ④ 重复②和③直到图 T 连通为止。

    由于只需要维护连通性,可以不需要真正建立图 T,可以用并查集来维护。

    4、prim算法

    Prim 算法和 Kruskal 算法一样也是寻找最小生成树的一种方法:

    ① 先建立一个只有一个结点的树,这个结点可以是原图中任意的一个结点。

    ② 使用一条边扩展这个树,要求这条边一个顶点在树中另一 个顶点不在树中,并且这条边的权值要求最小。

    ③ 重复步骤②直到所有顶点都在树中。

    这里记顶点数v,边数e

    邻接矩阵: O(v^2) 

    邻接表: O(elog2v)

    此为原始的加权连通图。每条边一侧的数字代表其权值。

    ....(举例省略)

    (是不是有点像最短路算法中的迪杰斯特拉?其实代码实现也差不多)

  • 相关阅读:
    百行代码实现基于Redis的可靠延迟队列
    一文读懂 BizDevOps:数字化转型下的技术破局
    -bash: spawn: 未找到命令
    华为OD机考:0030-0031-n*n数组中二进制的最大数、整数的连续自然数之和
    【李航统计学习】第 1 章 统计学习方法概论 笔记
    day4作业
    DOM节点
    第二十章——多线程
    二叉搜索树
    CommonsCollections1利用链分析
  • 原文地址:https://blog.csdn.net/m0_52711790/article/details/127838994