图论知识点总结3 最小生成树(实时更新)
一、两个基本算法的适用情况
kruskal算法比较常用,适合稀疏图(大多数题目的图都是稀疏图),其复杂度主要与边数m有关。而prim比较适合稠密图,因此常用邻接矩阵存图,复杂度主要与点数n有关。
最短网络
https://www.acwing.com/problem/content/1142/
模板题,用两种算法都可以。
二、kruskal算法的特性
1.繁忙的都市
https://www.acwing.com/problem/content/1144/
生成的最小生成树的最大的边权值最小。
2.联络员
https://www.acwing.com/problem/content/description/1145/
可以从中间开始建立最小生成树,而prim就必须从头开始。
三、先立后破
连接格点
https://www.acwing.com/problem/content/description/1146/
有些题,是需要我们从头开始构建一个最小生成树。这时可以先建一个完全图(或者把合法的边全部建出来)。然后再用最小生成树算法选出最小生成树对应的边。
四、逆向思考,正难则反
兽径管理
https://www.luogu.com.cn/problem/P1340
对于动态加边,每次都要求最小生成树的,可以不用每次都重新跑一遍最小kruskal.只需要从最后的一个最小生成树往前推,只要新加的边不在树上,就不用重跑。
五、超级源点
新的开始
https://www.acwing.com/problem/content/1148/
六、树扩图
走廊泼水节
https://www.acwing.com/problem/content/348/
①一棵树如何扩充为完全图?
对树上的边从小到大排序,每次合并边的两端点所在的集合。设树上的边为{a,b,w}。为什么要从小到大排序?因为加的边的边长与w有关,越加到后面需要加的边越少。
②连多少条边?
对于一棵树,其肯定是没有环存在的,因此对于树上的一条边{a,b,w},去除这条边之后,a和b是在两个不同的集合里的,分别为S1和S2,因此要连size(S1)*size(S2)-1条边。
③连边的权重是多少?
1)能否小于w?
不行,因为如果小于w,则对于新连边构成的环路,再去掉原先的长度为w的边,就会构成一个更小的最小生成树,不满足题意。
2)能否等于w?
同1),会使得最小生成树不唯一。
3)能否恰好等于w+1?
可以,且保证了增加的边的权值总和最小。
注:以上的证明方式在生成树类型的题目中比较常见,应该学会举一反三。
七、次小生成树
次小生成树
https://www.acwing.com/problem/content/description/358/
对于次小生成树的讲解,可以参考https://oi-wiki.org/graph/mst/
对于图的所有生成树,各边权值和次小的成为次小生成树,分为严格次小生成树和非严格次小生成树。
从思路上来看不难。基本思路就是枚举。两种方法(第一种不好求严格次小)
①枚举最小生成树的树边②枚举非树边
主要使用的是第二种方法。
有一个定理:次小生成树一定在最小生成树的邻集中(证明略)
于是做法是:枚举每次将一条非树边加进来,然后会生成一个环,再去掉这个环上的一个最大的树边。(所以要提前维护好树上任意两点间的经过路径的最大边权,可以用dfs和lca)

浙公网安备 33010602011771号