最小生成树
最小生成树
最小生成树也是一种常见的有权无向图问题,为了解决此问题,引出了本章的两个算法。
本章将包括:
一.基本概念
1.什么是最小生成树?
在一幅有权无向图中,把联通所有点且不含回路的一个子图称为一棵生成树,其中边权最小的生成树称为最小生成树(简称
2. 算法的思路
二. 算法
1.算法思路
由于
2.代码详解
由于其只用到了边的关系,我们只需维护一个简单的边集数组即可。
struct node{
int u,v,w; //边集数组,u为起点,v为终点,w为边权
}e[maxn];
bool cmp(node a,node b){
return a.w<b.w; //排序用的cmp函数,对边进行排序,找最小边
}
int fa[maxn];
int find(int x){ //并查集的查询操作
if(x!=fa[x])
fa[x]=find(fa[x]); //路径压缩优化
return fa[x];
}
int kruskal(){
sort(e+1,e+m+1,cmp);
for(int i=1;i<=n;i++) fa[i]=i; //并查集初始化
int ans=0;
for(int i=1;i<=m;i++){
int u=e[i].u,v=e[i].v,w=e[i].w;
if(find(u)==find(v)) continue; //若已是联通
else{
ans+=w; //统计答案
fa[find(u)]=find(v); //联通
}
}
return ans;
}
3.算法总结
三. 算法
1.算法思想
不同于
对于每个点来说,由于
2.代码详解
int prim(){
int s=1; //若以1为起点
for(int i=1;i<=maxn;i++) done[i]=false; //初始化,done[i]表示点i是否在队列中
priority_queue<node> q; //优先队列,存边权的长度
q.push(node(s,0));
int ans=0;
while(!q.empty()){
node u=q.top();
q.pop();
if(done[q.id]) continue; //表示以在MST中,跳过
done[q.id]=true; //标记存在
ans+=q.w;
for(int i=0;i<g[u.id].size();i++){ //枚举全部邻居
edge y=g[u.id][i];
if(done[y.to]) continue; //若邻居已入队,跳过
q.push(node(y.to,y.w)); //其邻居入队
}
}
return ans;
}
3.算法总结
由代码可看出,
四.总结
最小生成树是图论算法中较为重要的一种问题,当然其算法较为简单,但应充分理解其思想。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了