并查集模板

本文最后更新于:3 years ago

1.并查集

1
2
3
4
5
6
7
8
9
10
11
12
const int MAXN = 1e5 + 5e2;
int bin[MAXN];
inline int find (int x) {
return bin[x] == x ? x : (bin[x] = find(bin[x]);
}
inline void merge(int a, int b) {
int fa = find(a);
int fb = find(b);
if (fa != fb) {
bin[fa] = fb;
}
}

2.带权并查集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

const int MAXN = 2e5 + 5e2;
int bin[MAXN], sum[MAXN];
int res = 0;
inline int find(int x) {
if (x != bin[x]) {
int temp = bin[x];
bin[x] = find(bin[x]);
sum[x] += sum[temp];
}
return bin[x];
}
inline void merge(int a, int b, int val) {
int fa = find(a);
int fb = find(b);
if (fa != fb) {
bin[fa] = fb;
sum[fa] = - sum[a] + sum[b] + val; //合并后a到fa的权值会是反的,素以需要减去
}
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!