• 重谈MST及Kruskal算法


    重谈MST及Kruskal算法

    当初学MST(Minimum Spanning Tree)最小生成树的时候,还是懵懵懂懂,不求慎解。所以只记下了模板,狂拍了几道板子题和板子题加一点点变形的题目。所以今天来温故而知新一下。


    MST的一些性质

    这里有一个定理,就是MST一定包含全图权值最小的边。用反证法可证明这个定理。如果有一条边不在MST中但是比MST的所有边权更小,那么这条边可以和MST的一条路径一起构成一个环,用这条边任意替换环里的一条边,可以得到一个更M的MST。

    证毕。

    所以放出一个大推论(哦!好难)

    给定一张无向图(G=(V,E)),从(E)中选出(k<n-1)条边构成(G)的一个生成森林,若再从剩下的(m-k)条边中选(n-1-k)条添加到生成森林中使之成为(G)的MST,则该MST一定包含这(m-k)条边中链接生成森林的两个不连通节点的权值最小边。

    看起来很难,但是其实这就是一个贪心策略。

    其实求MST的过程就是从中选边把所有节点连起来,并且要求边权和最小的一个过程。那么从头开始,现在有一堆散点,我们开始连,肯定要挑选最小的边开始,然后依次取最小,如果可以加(即加边不构成环),就继续添加,否则就跳过。这么一个贪心策略肯定是最优的。


    Kruskal算法

    于是,基于上述策略,通过模拟就可以得到Kruskal算法,也就是把边录入之后进行排序,用并查集维护是否出现环,之后从小到大逐次向MST中添加即可。添加到n-1条边时即求出MST。

    代码略。

  • 相关阅读:
    ServletContext笔记
    Session笔记
    Cookie笔记
    递归实现取数组最大值
    栈结构实现队列结构
    返回栈中最小元素的两种实现O(1)
    数组实现不超过固定大小的队列(环形数组)
    双向链表实现栈和队列
    Windows Server 2008 R2 / Windows Server 2012 R2 安装 .NET Core 3.1
    Windows 7 / Windows Server 2008 R2 升级至 SP1
  • 原文地址:https://www.cnblogs.com/fusiwei/p/13724300.html
Copyright © 2020-2023  润新知