最小生成树小结

问题引入:

新兴城镇之间需要修建道路,两两城镇之间修建道路所需的花费是不一样的,在保证所有城镇相通的情况下,求最小花费。

这道题需要用到最小生成树的相关知识。

一、最小生成树的概念#

1. 最小生成树的定义#

在一个|V|个点的无向连通图中,取|V|1条边,并使所有点相连,所得到的子图被称为原图的一棵生成树;在一个带权的无向连通图中各边权之和最小的一棵生成树即为原图的最小生成树。

2. 最小生成树的性质#

  1. 图中权值最小的边(如果唯一的话)一定在最小生成树上。

  2. 对于一个图G,如果图中的边权值都不相同,则图的最小生成树是唯一的,反之亦然。

  3. 一个图G,各个最小生成树的形态不同,但权值相同的边的数量一定相等。

3. 关于对性质3的证明#

在一个图G中,AB是它的两棵不同的最小生成树。组成A的边为{ai},组成B的边为{bi},现在我们需要证明,把AB边的权值按从小到大排序后的序列是一样的,即对于所有i,都有w(ai)=w(bi)

思考在第i个位置,第一次出现了aibi

不妨设w(bi)w(ai)

情况1biA中,那么必存在aj=bi,并且j>i(因为i是第一次出现不相同的边啊)。这时即有w(bi)w(ai)w(aj)=w(bi),所以w(bi)=w(aj)=w(ai),所以交换aiaj的位置并不会影响A的有序序列,两棵树在第i号位置变成了一条边。

情况2bi不在A中,考虑把它加入A中,则形成了一个环,并且环上所有权值vw(bi)(不然A就不是最小生成树)。也就是说,这个环上存在着另一条边aj不在B中(如果在B中就会形成环),且j>ii是第一次出现不相同的边),w(aj)w(bi)。于是,w(bi)w(ai)w(aj)w(bi),同样三者相等。那么我们就可以交换biaj,没有影响到A的有序序列,然后转换成情况1

二、两种计算最小生成树的算法#

1. Prim算法#

贪心算法,原理略。

Copy
inline void Prim() { memset(vis, 0, sizeof vis); int s = n; while(s --) { minn = INF; for (int i = 1;i <= n; ++i) { if (!vis[i] && v[i] < minn) { minn = v[i], pos = i; } } vis[pos] = 1, ans += v[pos]; for (int i = 1;i <= n; ++i) { if (!vis[i] && v[i] > dis[pos][i]) { v[i] = dis[pos][i]; } } } }

2. Kruskal算法#

同样的贪心算法,同样地略

Copy
inline void Kruskal() { sort_by_w(edg + 1, edg + 1 + m, cmp);//从小到大 for (int i = 1;i <= m; ++i) { if(cnt >= n) return; int x = edg[i].u, y = edg[i].v; int fx = find(x), fy = find(y); if (fx != fy) { cnt ++; ans += edg[i].w; f[fx] = fy; } } }

三、练手题目&一句话分析#

1. 黑暗城堡#

求最短路树计数,那先SPFA跑一遍dis,然后枚举每个点,乘法原理,就行了。

2. 北极通讯网络#

把题意转换下,就是叫你求第k大最小生成树上的边,OK

3. 构造完全图#

思考Kruskal算法的流程,每次加边时,对答案的贡献应是(size[x]×size[y]1)×(w+1)

4. 秘密的牛奶运输(严格次小生成树)#

先跑个最小生成树,然后考虑加入每条非树边,在形成的环上去掉一条最大边,当然,要保证严格次小,还需要保留次小边,用倍增实现。

5. 最小生成树计数#

有个性质:各个最小生成树的形态不同,但权值相同的边的数量一定相等。所以跑一遍最小生成树后直接暴力搜索,数据较小。

6. Tree#

二分给白边加偏移量,然后跑最小生成树。

posted @   SilentEAG  阅读(444)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示
CONTENTS