克鲁斯卡尔(Kruskal)算法原理及图解案例
创作时间:
作者:
@小白创作中心
克鲁斯卡尔(Kruskal)算法原理及图解案例
引用
CSDN
1.
https://blog.csdn.net/2203_75994275/article/details/145669227
克鲁斯卡尔(Kruskal)算法是一种用于寻找图的最小生成树的算法。它通过贪心策略,逐步选择权值最小的边来构建最小生成树。本文将详细介绍克鲁斯卡尔算法的原理、实现过程,并通过图解案例和代码示例帮助读者更好地理解。
什么是克鲁斯卡尔算法?
克鲁斯卡尔算法是一种最小生成树算法,由Joseph Kruskal在1956年发表。最小生成树(Minimum Spanning Tree,MST)简单来说就是:在一个连通图中,找出其中的一个可以使各个点之间连通且路权之和最小的连接方法,然后根据这个连接方法生成一个树。
算法原理
克鲁斯卡尔算法的实现过程如下:
- 将每一个点都看作一个无根树(独立的集合),并把这个图上的边全部存储下来,然后把所有边删掉
- 将每一条边按权值大小从小到大排序
- 遍历每一条存储下来的边,用并查集判断这条边所连接的两个点是否在同一个集合内(查询是否连通):
- 若在,那么就不用添加这条边到最小生成树里去
- 若不在,这条边一定是最小生成树的一部分
这个过程利用了贪心策略:
- 如果两个点已经连通,那么先前的连接方案的权值一定是小于或等于使用这条边连接的
- 如果两个点不连通,那么使用当前边连接这两个点一定是权值最小的,因为边是按照权值从大到小排序的,往后遍历的权值一定大于等于当前边
实现过程
假设我们有一个图如下:
按照克鲁斯卡尔算法的步骤:
- 将图中的边按权值从小到大排序
- 依次检查每条边:
- 第一条边(2,5):不连通,连接
- 第二条边(3,5):不连通,连接
- 第三条边(1,3):不连通,连接
- 第四条边(1,5):已连通,跳过
- 第五条边(3,4):不连通,连接
- 第六条边(2,6):不连通,连接
- 第七条边(1,6):已连通,跳过
最终得到的最小生成树如下:
代码实现
以下是输出最小生成树权值和的C++代码实现:
#include<bits/stdc++.h>
#define ll long long
#define maxn 101
#define maxm 1000001
using namespace std;
ll n,m,ans;
ll fa[maxn],h[maxn]; //并查集需要用到的两个数组,分别是祖先和家族高度
struct node //使用结构体方便排序与存储
{
ll u,v,w;
}e[maxm];
ll find(ll r) //找祖宗并更新
{
if(r==fa[r]) return r;
else return fa[r]=find(fa[r]);
}
void merge(ll x,ll y) //合并集合
{
ll fx=find(x);
ll fy=find(y);
if(h[fx]>h[fy]) fa[fy]=fa[fx];
else if(h[fx]<h[fy]) fa[fx]=fa[fy];
else
{
fa[fy]=fa[fx];
h[fx]++;
}
}
void kruskal()
{
int cnt=0;//选取边的数量,因为最小生成树的边数一定是n-1(要保证连通),所以可以做一个小剪枝
for(int i=1;i<=n;i++) fa[i]=i; //初始的时候都是独立的集合
for(ll i=1;i<=m&&cnt<=n-1;i++)
{
ll u=e[i].u,v=e[i].v;
ll fu=find(u);
ll fv=find(v);
if(fu==fv) continue ; //若在一个集合,跳过
cnt++; //加入最小生成树
ans+=e[i].w;
merge(u,v); //连接两个点
}
}
bool cmp(node a,node b)
{
return a.w<b.w;
}
int main()
{
cin>>n>>m;
for(ll i=1;i<=m;i++)
{
cin>>e[i].u>>e[i].v>>e[i].w;
}
sort(e+1,e+1+m,cmp);
kruskal();
cout<<ans;
}
通过以上步骤和代码,我们可以清晰地理解克鲁斯卡尔算法的工作原理和实现方法。
热门推荐
票房破100亿《哪吒2》做对了什么?
全球商业动态:科技巨头加码AI投资,车企筹划重组
航拍祁连山脉东段最高峰——岗什卡雪峰

失温急救处理方法
《洛杉矶之战》:科幻战争片的真实与不足
命宫天梁含义解析:紫微斗数中的天梁星影响
2025 申请西班牙签证费用及流程指南!
中医怎么缓解更年期不适
快思考与慢思考 Agent 的结合
AI智能助力:创新歌词创作之道——人工智能作词新篇章
群晖虚拟机如何做快
情感心理咨询:伴侣是焦虑型,时好时坏,该如何与ta相处?
这里的烤鱼,为何能让郭沫若称赞?

桂林这3处小众景点,全部去过的人并不多!
蓝色兰花的花语与美丽(揭秘蓝色兰花背后的寓意与情感)
车损险保额应该如何确定
金融数据背后的变与不变——6月金融数据点评
做短视频新手入门?如何快速掌握短视频制作技巧?
古装剧如何走出“爽文”怪圈
在人际关系中坚持自我的重要性:从忍让到适度反击的智慧
法国王后埃莉诺:从被废黜到成为英国王后的人生传奇
藍莓超強抗氧化力!超級食物藍莓8功效「改善記憶力、預防老化」+3食用禁忌
游戏行业能从《刺客信条:影》挨骂这件事里学到什么?
“比特币…… 已无潜力”—— 以太坊研究员引发关于 “稳健货币” 的辩论
高血糖一口玉米都不能吃?医生直言:这几类人,吃得越多身体越差
吃黑芝麻有副作用吗?了解黑芝麻好处、食用方法及禁忌
鬼谷八荒噬魂剑攻略:获取方式、使用技巧与搭配建议
学会断舍离后,坚决扔掉家里8件“负能量”,全屋干净整洁,生活更轻松
鱼米之乡江苏省,江苏旅游攻略,江苏十佳优质景点推荐
如何关闭汽车的空调系统?关闭汽车空调的操作方法和注意事项有哪些?