最小生成树总结
定义:一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边。
求解方法:
·Kruskal
·Prim
·Boruvka
Kruskal
构造过程:
先构造一个只含 n 个顶点,而边集为空的子图,若将该子图中各个顶点看成是各棵树上的根结点,则它是一个含有 n 棵树的一个森林。
之后,从网的边集 E 中选取一条权值最小的边,若该条边的两个顶点分属不同的树,则将其加入子图,也就是说,将这两个顶点分别所在的两棵树合成一棵树;反之,若该条边的两个顶点已落在同一棵树上,则不可取,而应该取下一条权值最小的边再试之。
依次类推,直至森林中只有一棵树,也即子图中含有 n-1条边为止。
直接数学证明(调整法)
·设真正的MST是T,如当前最短的边e不在T中
将e强制添加到MST,必然形成一个环 (此时称为基环树)
·删掉环上任意其他边e,得到一个新生成树T’
max{ T{e}+{e’}}<=max{T},则T也是MST
结论: e一定在某个MST中,证毕
Prim
构造过程:
一个加权连通图,其中顶点集合为V,边集合为E;
初始化Vnew = {x},其中x为集合V中的任一节点(起始点),Enew = {},为空;
重复下列操作,直到Vnew = V:
a.在集合E中选取权值最小的边<u, v>,其中u为集合Vnew中的元素,而v不在Vnew集合当中,并且v∈V(如果存在有多条满足前述条件即具有相同权值的边,则可任意选取其中之一);
b.将v加入集合Vnew中,将<u, v>边加入集合Enew中;
使用集合Vnew和Enew来描述所得到的最小生成树。
**证明:**如e∉任意⽣成树T
将e强加到T形成⼀个环,再删掉环上u的另⼀零边e‘
则T’=T T ∪ {e}\{e’}也是⽣成树
所以
⽽
则
即T’包含e且不会变差,证毕
Boruvka
构造过程:
创建一个图表;
从一堆未连接的树开始(树的数量=顶点的数量);
当存在未连接的树时,对于每个未连接的树:
(1)以较小的重量找到它的边缘
(2)添加此边以连接另一棵树
正确性证明:
1.最优性:最小边一定包含在生成树中。
2.合法性:一定不会构成环。如果存在环说明一个点的最小连边有两个,显然矛盾。
区别
时间复杂度
Kruskal O(m log m)
Prim 稠密图O(n^2+m)
稀疏图O(m log m)
Boruvka O( (n+m) log m)
代码难度
Kruskal<Prim < Boruvka
结果
Kruskal 边集
Prim 有根树
Boruvka 边集
特点
Kruskal 直接兼容⾮连通图
Prim 只能找⼀个连通分⽀
Boruvka 可以做完全图!!!
总结
Kruskal 可以的情况优先写,代码简单,边多会超时
Prim 边多时优势,但代码相对复杂
Boruvka 边多、点多时有时间的优势,代码复杂