填坑行动5-最小生成树kruskal 学习笔记
板子题
题目描述
如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出 orz
。
输入格式
第一行包含两个整数表示该图共有个结点和条无向边。
接下来行每行包含三个整数 ,表示有一条长度为 的无向边连接结点X。
输出格式
如果该图连通,则输出一个整数表示最小生成树的各边的长度之和。如果该图不连通则输出orz
。
题目解析
首先,我们需要知道最小生成树是什么。
我们知道数是一个没有环的连通图,要在一张图里面找出边权和最小的一棵树就是最小生成树。
算法解析
这里我们以kruskal为例来讲解算法。
kruskal首先将每条边按照边权从小到大进行排序,这里通常使用快速排序,就是C++的sort
。
然后从小到大来逐个判断这条边是否在同一个连通图内(假设这个图只有我们我们要加上的边),如果不是,就加上这条边。
当然,我们还要使用并查集来维护多个点是否在同一个连通图以内。
代码
#include<cstdio> #include<algorithm> #define maxn 200039 using namespace std; struct edge{ int f,t,w; bool operator < (const edge x) const { return this->w < x.w; } }a[maxn]; int f[5039]; int getfa(int x){ if(x==f[x]) return x; f[x]=getfa(f[x]); return f[x]; } int n,m,i,j,k; int main(){ scanf("%d%d",&n,&m); for(i=0;i<=n;i++) f[i]=i; for(i=1;i<=m;i++) scanf("%d%d%d",&a[i].f,&a[i].t,&a[i].w); sort(a+1,a+m+1); int k=0; int ans=0; for(i=1;i<=m;i++){ if(k==n-1){ printf("%d",ans); return 0; } if(getfa(a[i].f)!=getfa(a[i].t)){ f[getfa(a[i].f)]=a[i].t; k++; ans+=a[i].w; } } printf("orz"); return 0; }
发现自己变sb了连并查集都快不会打了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具