当前位置:网站首页>图论之Kruskal,最小生成树如何优雅解题?
图论之Kruskal,最小生成树如何优雅解题?
2022-08-02 12:49:00 【sheep.ice】
一、前言
对于最小生成树的问题来说的话,我们可以发现如果直接利用我们的dijkstra算法,每次去遍历一个点,然后通过一个点的话去更新其他的所有边,在这样的过程中,换一个理解的方式来看的话,不过就是把我们所有的最短的边连起来,也就是,我们尝试将所有有关系的点通过最短的概念,连接起来,然后能够通过这样的方式,在集合内部已经连好的点,就不会在继续连,也就是我们一旦选定两个点进行边的连接的话,我们一定会选最短的,然后最后我们判断一下是否所有的点到最后会被连接到一个集合之中就好了。有了这个思路,我们其实就可以利用今天所讲到的Kruskal算法进行最短边的尝试,知道我们能够去让所有点入集合。
二、题目汇总
①Kruskal算法模板(ACwing.859)

相关分析
时间复杂度: O ( m l o g n ) O(mlogn) O(mlogn)
适用场景: 点数和边数都比较多的最小生成树的问题,应用面广于之前所说的Prim算法。
思路: 将所有的边进行排序,贪心的从最短的边开始遍历,一旦发现我们遍历的那个边能够加到我们的集合中的话,我们就可以加到我们的集合当中去的话就加入。那么判断这个边是否能够加入我们之前的集合当中去,无非就是看一下这个边加入集合后,会不会破坏我们的生成树的条件,而我们知道,一棵树只有一个根节点,我们只要满足每次加入的时候保证根节点只有一个就好了,这里就可以用并查集进行优化,最后我们只要判断一下是否所有边的数量为n - 1就好了!
完整AC代码
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5 + 5, M = 2 * N + 10;
//因为是遍历所有的边,用结构体装一下就好了
struct Edge {
//代表a, b有一条权值为c的边
int a, b, c;
//为了按照边从小到大排序的话,需要重载一下小于号
//这里的写法主要是学比如写的,具体其实两个const和一个&不要也可以的
bool operator< (const Edge& W) const {
return c < W.c;
}
}edges[M];
//并查集的pre数组
int pre[N];
//并查集加路径压缩的函数写法
int find(int x) {
if(x != pre[x]) pre[x] = find(pre[x]);
return pre[x];
}
int main() {
int n, m;
cin >> n >> m;
//初始化一下我们的并查集的点
for(int i = 1; i <= n; i ++ ) pre[i] = i;
for(int i = 0; i < m; i ++ ) {
int a, b, c;
cin >> a >> b >> c;
edges[i] = {a, b, c};
}
sort(edges, edges + m);
//记录加的边,和最终的结果
int cnt = 0, ans = 0;
//遍历一下所有的边
for(int i = 0; i < m; i ++ ) {
auto t = edges[i];
int f1 = find(t.a), f2 = find(t.b);
if(f1 != f2) {
//可以把边加入
cnt++;
//把两个不相连的集合连起来
pre[f1] = f2;
ans += t.c;
if(cnt == n - 1) break;
}
}
if(cnt != n - 1) cout << "impossible" << endl;
else cout << ans << endl;
// cout << cnt << endl;
return 0;
}
②未完待续
边栏推荐
- 用位运算为你的程序加速
- FreeRTOS实验--删除任务
- svg气球升起爆炸js特效
- #夏日挑战赛#【FFH】OpenHarmony设备开发基础(三)编译依赖
- Pod调度策略:亲和性、污点与污点容忍
- zabbix automated monitoring script
- How to better assess credit risk?Just watch this scorecard model live
- MyCat2 introduction and installation and basic use
- How to turn off hardware acceleration [easy to understand]
- 企业用直播平台能实现什么
猜你喜欢
随机推荐
技术分享| 融合调度系统中的电子围栏功能说明
FreeRTOS--优先级实验
Js scratchable latex style draw plug-in
7种最常用数据分析思维,解决95%的分析难题
水平垂直居中方式
如何关闭开启硬件加速[通俗易懂]
以Boost为例的type3电压环补偿器实例
pgsql数据库实现导入导出
Pod Scheduling Strategy: Affinity, Stain and Stain Tolerance
LeetCode_377_Combination Sum IV
新特性解读 | MySQL 8.0 GIPK 不可见主键
js true 3d histogram plugin
pytorch模型转tensorflow模型
kvm部署
SQL中字符串拼接
How to better assess credit risk?Just watch this scorecard model live
An example of type3 voltage loop compensator taking Boost as an example
FreeRTOS创建任务--动态创建、静态创建
np.nan, np.isnan, None, pd.isnull, pd.isna finishing and summary
SQL Server如何建表









