并查集题目合集

1、畅通工程 传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1232
#include<bits/stdc++.h> 
using namespace std;
int bin[1010];
int findx(int x){
	int r=x;
	while(bin[r]!=r){
		r=bin[r];
	}
	return r;
}
void merge(int x, int y){
	int fx=findx(x), fy=findx(y);
	if(fx!=fy) bin[fx]=fy;
}
int main() {
	int x, y, n, m;
	while(cin>>n, n){
    	cin>>m;
    	int num=0;
		for(int i=1; i<=n; i++){
			bin[i]=i;
		}
		while(m--){
			cin>>x>>y;
			merge(x, y);
		}
		for(int i=1; i<=n; i++){
			if(bin[i]==i) num++;
		}
		cout<<num-1<<endl;
	}return 0;
}

2、How Many Tables 传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1213
#include<bits/stdc++.h>
using namespace std;
int bin[1010];
int findx(int x){
	int r=x;
	while(r!=bin[r]){
		r=bin[r];
	}
	return r;
}
void merge(int x, int y){
	int fx=findx(x), fy=findx(y);
	if(fx!=fy){
		bin[fx]=fy;
	}
}
int main()
{
    int t;
    cin>>t;
	while(t--){
		int n, m, a, b;
		cin>>n>>m;
		for(int i=1; i<=n; i++){
			bin[i]=i;
		}
		while(m--)
		{
			cin>>a>>b;
			merge(a, b);
		}
		int num=0;
		for(int i=1; i<=n; i++){
			if(bin[i]==i) num++;
		}
		cout<<num<<endl;
	}
    return 0;
}
作多了,发现就是套个模板的事情。(●'◡'●)不定时更新题目。