int n;// 有n个节点
vector<int>ranks(n,1);//记录高度
vector<int>fa(n,0);//记录爸爸
for (int i = 0; i < n; ++i)
fa[i] = i;
int find(int x) {
if (fa[x] == x) return x;
else {
fa[x] = find(fa[x]); //路径压缩,把查询的所有人的爸爸都设为同一人
return fa[x];
}
}
void merge(int x, int y) {
//把高度小的往高度大的树上靠,以减小高度
int px = find(fa[x]);
int py = find(fa[y]);
if (ranks[px] > ranks[py]) fa[py] = px;
else if (ranks[px] < ranks[py]) fa[px] = py;
else {
fa[px] = py;
ranks[py]++;
}
}
并查集(适用于无向图查关系)
最新推荐文章于 2024-07-25 11:18:29 发布