对于一个带权连通无向图G=(V,E),生成树不同,每棵树的权(即树中所有边上的权值
之和)也可能不同。设R为G的所有生成树的集合,若T为R中边的权值之和最小的生成
树,则T称为G的最小生成树(Minimum-Spanning-Tree,MST)。
- 最小生成树可能有多个,但边的权值之和总是唯一且最小的
- 最小生成树的边数=顶点数-1。砍掉一条则不连通,增加一条边则会出现回路
- 如果一个连通图本身就是一棵树,则其最小生成树就是它本身
- 只有连通图才有生成树,非连通图只有生成森林
Prim算法(普利姆)
从某一个顶点开始构建生成树;
每次将代价最小的新顶点纳入生成树,直到所有顶点都纳入为止。
时间复杂度:O(|𝑉|2)——适合用于边稠密图
Prim算法思想:
从𝑉0开始,总共需要n-1轮处理
每一轮处理:循环遍历所有结点,找到lowCast最低的,且还没加入树的顶点
再次循环遍历,更新还没加入各个顶点的lowCast值
每一轮时间复杂度:O(2n)
总时间复杂度:O(𝑛2),即0(|𝑉|2)
Kruskal算法(克鲁斯卡尔)
每次选择一条权值最小的边,使这条边的两头连通(原本已经连通的就不选)
直到所有结点都连通
时间复杂度:O(|E|log2|𝐸|)——适合用于边稀疏图
Kruskal算法思想:
初始:将各条边按权值排序
共执行|E|轮,每轮判断两个顶点是否属于同一集合,不属于则连接起来,需要O(log2|E|)
总时间复杂度:O(|E|log2|E|)