并查集模板
并查集可以判断图的连通性,属于几个集合,相当于每个班的班长是谁,有几个班
并查集模板
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int s[N];
void init_set(){
for(int i=1;i<=N;i++){
s[i] = i;
}
}
int find_set(int x){
return s[x]==x? x:find_set(s[x]);
}
void merge_set(int x,int y){
x = find_set(x);
y = find_set(y);
if(x!=y){
s[x] = y;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int m,n,k;
cin >> m >> n >> k;
init_set();
while(k--){
int x,y;
cin >> x >> y;
merge_set(x,y);
}
int res = 0;
for(int i=1;i<=m*n;i++){
if(s[i]==i) res++;
}
cout << res;
return 0;
}
路径压缩
int find_set(int x){
//路径压缩
if(s[x]!=x){
s[x] = find_set(s[x]);
}
return s[x];
}
带权值并查集
//记录当前点到跟的距离
int find_set(int x){
if(s[x]!=x){
int t = s[x];//记录父节点
s[x] = find_set(s[x]);
d[x] += d[t];
}
return s[x];
}

浙公网安备 33010602011771号