1.概念
2.Prim算法
3.Kruskal算法
1.概念
(1)生成树
连通图的生成树是包含图中全部顶点的一个极小连通子图。(边尽可能的少, 但要保持连通)
若图中顶点数为n,则它的生成树含有 n-1 条边。对生成树而言,若砍去它的一条边,则会变成非连通 图,若加上一条边则会形成一个回路。
(2)最小生成树(最小代价树)
道路规划要求:所有地方都连通,且成本尽可能的低
对于⼀个带权连通⽆向图G = (V, E),⽣成树不同,每棵树的权(即树中所有边上的权值之和)也可能不同。
设R为G的所有⽣成树的集合,若T为R中边的权值之和最⼩的⽣成树,则T称为G的最⼩⽣成树(Minimum-Spanning-Tree, MST)
• 最⼩⽣成树可能有多个,但边的权值之和总是唯⼀且最⼩的
• 最⼩⽣成树的边数 = 顶点数 - 1。砍掉⼀条则不连通,增加⼀条边则会出现回路
• 如果⼀个连通图本身就是⼀棵树,则其最⼩⽣成树就是它本身
• 只有连通图才有⽣成树,⾮连通图只有生成森林
2.Prim算法(普里姆算法)
从某⼀个顶点开始构建生成树; 每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止。
实现思想:
初始:从V0开始
标记各节点是 否已加⼊树:isJoin
各节点加⼊树 的最低代价:lowCost
第1轮:循环遍历所有个结点,找到lowCost最低的,且还没加⼊树的顶点
再次循环遍历,更新还没加⼊的各个顶点的lowCost值
第2轮:循环遍历所有个结点,找到lowCost最低的,且还没加⼊树的顶点
再次循环遍历,更新还没加⼊的各个顶点的lowCost值
...
3.Kruskal算法(克鲁斯卡尔)
每次选择⼀条权值最⼩的边,使这条边的两头连通(原本已经连通的就不选),直到所有结点都连通。
实现思想:
初始:将各条边按权值排序
第1轮:检查第1条边的两个顶点是否 连通(是否属于同⼀个集合)
第2轮:检查第2条边的两个顶点是否 连通(是否属于同⼀个集合)
...
共执⾏ e 轮,每轮判断两个顶点是 否属于同⼀集合,需要 O(log_2(e))
总时间复杂度 O(elog2_(e))
4.对比