mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
82 字
1 分钟
kruskal最小生成树
2026-06-08

前言#

今天看ppt,才发现老师讲的是kruskal算法…

介绍#

这是一种每次将分属不同树的最小边加入图的算法
所以我们不难联想到并查集

实现#

前置数据#

struct edge
{
int f, t, l;
};// 边,是的,我们甚至不需要链式前向星
struct cmp
{
bool operator()(edge a, edge b)
{
return a.l > b.l;
}
};
std::priority_queue<edge, std::vector<edge>, cmp> pq;// 存储边的优先队列,队顶是最短的边
std::vector<int>disjoint_set;// 并查集
int find(int x)// 查询
{
if(disjoint_set[x] != x)
disjoint_set[x] = find(disjoint_set[x]);
return disjoint_set[x];
}
void init_disjoint_set(int n)// 初始化并查集
{
disjoint_set.resize(n);
for(int i = 0; i < n; i++)
disjoint_set[i] = i;
}

合并子树#

while(!pq.empty())
{
// std::clog<<"RUA!"<<std::endl;
edge e = pq.top();// 获取最短边
pq.pop();
int f = find(e.f);
int t = find(e.t);
if(f == t)// 如果这条边属于同一个子最小生成树,那么不进行任何操作
continue;
if(f != t)
{
disjoint_set[f] = t;// 合并子树
cnt += e.l;
}
}

判断是否联通

for(int i = 1; i <= N; i++)
{
if(find(i) != find(1))
{
std::cout << "orz" << std::endl;
return 0;
}
}
std::cout << cnt << std::endl;

没什么难点,就这么简单

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

kruskal最小生成树
https://s701f.top/posts/kruskal最小生成树/
作者
五红酱自动机!
发布于
2026-06-08
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

目录