Kruskal最小生成树算法

Kruskal最小生成树算法

基于并查集实现的最小生成树算法,贪心选取最短的边,如果这条边连接的两个节点不在同一集合内,那就加入树

查询是否在同一集合已经合并集合的操作通过并查集实现

#include<bits/stdc++.h>
using namespace std;
struct edge{
int u,v,w;
};
vector<edge> e;
int n,m;
int fa[5010];
int cnt,sum;
int find(int x){
if (x==fa[x])
return x;
return fa[x]=find(fa[x]);
}
bool kruskal(void){
for (int i=0;i<=n;i++) fa[i]=i;
sort(e.begin(),e.end(),[](edge x,edge y){return x.w<y.w;});
for (auto [u,v,w]:e){
int x=find(u),y=find(v);
if (x!=y){
cnt++;
sum+=w;
fa[x]=y;
}
}
return cnt==n-1;
}
int main()
{
cin>>n>>m;
int u,v,w;
for (int i=1;i<=m;i++){
cin>>u>>v>>w;
e.push_back({u,v,w});
}
bool f=kruskal();
if (f) cout<<sum;
else cout<<"orz";
return 0;
}

算法开始时,将每个节点的祖先节点初始化为自己

对每条边按照边权排序后从小到大遍历,如果这条边连接的两个节点的祖先不同,那么就将这两个节点所在的集合进行合并

查询祖先节点时,使用路径压缩优化,因为我们只需要求解最短路,和并查集内部的结构无关

合并两个节点后,树内的节点数 \(+1\) ,累加总边权

最后返回树内的节点数是否等于总节点数\(-1\) ,如果相等,说明所有的点都可连通,最小生成树存在

posted @   才瓯  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示