[模板] 并查集

并查集

///并查集(路径压缩),修改查询O(logn),用于维护集合关系
struct DSU {
vector<int> fa;
explicit DSU(int n):fa(n + 1) {
for (int i = 1;i <= n;i++)
fa[i] = i;
}
void init(int n) {
for (int i = 1;i <= n;i++)
fa[i] = i;
}
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
bool same(int x, int y) { return find(x) == find(y); }
void merge(int x, int y) {
if ((x = find(x)) == (y = find(y))) return;
fa[x] = y;
}
};

带权并查集

///带权并查集(路径压缩),修改查询O(logn),用于维护集合带权关系
//一般都要大改find和merge,注意merge是x合并到y
struct DSU {
vector<int> fa;
vector<double> w;
explicit DSU(int n):fa(n + 1), w(n + 1, 1) {
for (int i = 1;i <= n;i++)
fa[i] = i;
}
void init(int n) {
for (int i = 1;i <= n;i++)
fa[i] = i, w[i] = 1;
}
int find(int x) {
if (fa[x] == x) return x;
int pre = fa[x];
fa[x] = find(fa[x]);
w[x] = w[x] * w[pre];
return fa[x];
}
bool same(int x, int y) { return find(x) == find(y); }
bool merge(int x, int y, double _w) {
if (same(x, y)) return abs(w[x] / w[y] - _w) < 1e-6;
int px = fa[x], py = fa[y];
fa[px] = py;
w[px] = 1 / w[x] * _w * w[y];
return true;
}
};
posted @   空白菌  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示