「学习笔记」最小生成树
最小生成树(Minimum Spanning Tree,MST)为边权和最小的生成树。
算法#
Kruskal 算法#
实现
将所有的边按边权从小到大排序,然后用并查集维护一条边所连接的两个点是否已联通(不能形成环)。
int find(int x) {
return fa[x] == x ? fa[x] : fa[x] = find(fa[x]);
}
ll kruskal() {
ll tot = 0, cot = 0;
sort(e + 1, e + m + 1);
for (int i = 1; i <= n; ++ i) {
fa[i] = i;
}
for (int i = 1; i <= m; ++ i) {
int x = e[i].u, y = e[i].v;
int fx = find(x), fy = find(y);
if (fx != fy) {
fa[fx] = fy;
tot += e[i].w;
++ cot;
if (cot >= n - 1) return tot;
}
}
return 0;
}
Prim 算法#
原理与 dijkstra 是一样的,都是用了贪心的思想。
dis[v]
连向 点的最小生成树的边的边长。
void prim() {
priority_queue<pil, vector<pil>, greater<pil> > q;
q.push(make_pair(0, 1));
while (!q.empty()) {
int u = q.top().second;
q.pop();
if (vis[u]) continue;
++ cnt;
tot += dis[u];
vis[u] = 1;
if (cnt >= n) return ;
for (auto it : son[u]) {
int v = it.first, w = it.second;
if (dis[v] > w) {
dis[v] = w;
q.push(make_pair(dis[v], v));
}
}
}
}
作者:yifan0305
出处:https://www.cnblogs.com/yifan0305/p/17363255.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载时还请标明出处哟!
朝气蓬勃 后生可畏
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了