How Many Tables

链接

[https://vjudge.net/contest/281085#problem/A]

题意

n个人参加宴席,有m个信息表示a与b认识,认识有传递性,
问最后该安排多少卓使得只有相互认识的在一起吃饭。

分析

裸的带路径压缩的并查集

代码

#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
int f[1010];
int r[1010];
void init(){
	for(int i=1;i<=n;i++)
	f[i]=i;
}
void k(){
	for(int i=1;i<=n;i++)
	r[i]=1;
}
int find(int x){
	if(f[x]==x) return x;
	else{
		f[x]=find(f[x]);
		return f[x];
	}
}
void unionSet(int x, int y) {
    if ((x = find(x)) == (y = find(y))) return;
    if (r[x] > r[y]) f[y] = x;
    else {
        f[x] = y;
        if (r[x] == r[y]) r[y]++;
    }
}
int main(){
	int T,a,b;
	//freopen("in.txt","r",stdin);
	cin>>T;
	while(T--){
		cin>>n>>m;
		init();
		k();
		for(int i=1;i<=m;i++){
			cin>>a>>b;
			unionSet(a,b);
		} 
		int sum=0;
		for(int i=1;i<=n;i++)
		if(f[i]==i) sum++;
		cout<<sum<<endl;
	}
	return 0;
}
posted @ 2019-01-26 20:13  ChunhaoMo  阅读(155)  评论(0)    收藏  举报