并查集模板

并查集可以判断图的连通性,属于几个集合,相当于每个班的班长是谁,有几个班

并查集模板

#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];
}
posted @ 2024-04-02 17:35  Nijika  阅读(7)  评论(0)    收藏  举报