图论知识点总结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) 

posted @ 2021-05-02 02:19  _rhinoceros  阅读(616)  评论(0)    收藏  举报