Minimum Spanning Tree - HolmesJJ/Data-Structures-and-Algorithms GitHub Wiki

加权无向图Weighted Undirected Graph

边权Edge Weight
一般定义 边上的权值,代表两个结点的距离(不同场景有不同的意思)
表示方法 w(e)
图例
邻接表 链表上的结点也要储存边权的值
邻接矩阵 矩阵中aij上不再是0或1,而是边权的值

定义

生成树Spanning Tree 最小生成树Minimum Spanning Tree
定义 生成树是连接所有节点的边的无环子集 生成树的所有边的边权之和最小
图例
割Cut(两个Partition) 横割Crosses a Cut(横跨两个Partition的边)
定义 图的所有结点分成两个不相交的子集的组件Partition 与边相连的两个结点分别在两个组件Partition中,则该边会横割Crosses a cut两个分区Partition
图例

入门链接

最小生成树(Kruskal(克鲁斯卡尔)和Prim(普里姆))算法动画演示 最小生成树 【数据结构】prim算法和kruskal算法求最小生成树

详解

算法: 最小生成树

属性

  • 无环
  • 若把图中的最小生成树切开两部分(移除其中一条边),则两部分依然是最小生成树
  • 对于可通过在最小生成树上的某两个结点添加一条边(原图就存在的边,只是标红)形成的每一个环,形成的环上的最大边权的边肯定不在最小生成树中,这意味着添加的那条边才是该环上边权最大的边
    • 如下左图中的红边是该图的最小生成树,下右图中上面新添加一条红边后,其中的几条红边(这里是所有红边)形成了一个环,这条新添加的红边就是该环上边权最大的边
  • 对于可通过在最小生成树上的某两个结点添加一条边(原图就存在的边,只是标红)形成的每一个环,形成的环上的最小边权的边可能在或可能不在最小生成树中
    • 最小生成树是形成的树中所有边的边权之和最小不一定每一条边的边权最小,这也是为什么不能用最小生成树求最短路径的原因
  • 横跨两个组件Partition的边所有边中,边权最小的边肯定在最小生成树中,这意味着对于某一个结点,与该结点相连的所有边中,边权最小的边肯定在最小生成树中,如下图,若A的边权最小,则A肯定是在最小生成树中,这是普里姆Prim算法的核心
  • 对于V个结点的图,最小生成树有V-1条边
  • 所有边权均不相同的无向图最小生成树是唯一的

算法比较

普里姆Prim's 克鲁斯克尔Kruskal's Boruvka's
时间复杂度E条边,V个结点
数据结构 优先队列AVL树

深度优先和广度优先也可以生成树,但是不是最小

适用场景

  • 网络设计
    • 电话网络Telephone networks
    • 电气网络Electrical networks
    • 计算机网络Computer networks
    • 以太网自动配置Ethernet autoconfig
    • 道路网Road networks
    • 瓶颈路径Bottleneck paths
  • 纠错码Error correcting codes
  • 脸部验证Face verification
  • 聚类分析Cluster analysis
  • 图像配准Image registration