题目描述:
今天是伊格内修斯的生日,他邀请了很多朋友,现在是晚餐时间了。伊格内修斯想知道至少要准备多少桌来宴请这些朋友。在场的人并不都是相互认识的,而每个人要求不和陌生人同桌。
如果A认识B,B认识C,那么A就算认识C,也就是说这认识有传递性。
举例,若A认识B,B认识C,D认识E,那么至少需要2桌。
输入格式:
第一行表示测试数据的组数T(1<=T<=25)
每组测试数据包含:
第一行N和M两个数(1<=N,M<=1000),N是朋友数量,M表示多少对直接认识的关系,朋友编号从1到N。
接下来M行,每行两个数A和B,表示A直接认识B。
注意:每两组之前有一行空行。
输出格式:
每组测试数据输出一行包含一个数,表示最少的桌数。
样例输入:
2 6 4 1 2 2 3 3 4 1 4 8 10 1 2 2 3 5 6 7 5 4 6 3 6 6 7 2 5 2 4 4 3
样例输出:
3 2
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m;
vector<int> f;
void init(){
f.resize(n+1);
for(int i=0;i<=n;i++) f[i]=i;
}
int fa(int a){
if(f[a]==a) return a;
return f[a]=fa(f[a]);
}
bool check(int u,int v){
u=fa(u);v=fa(v);
return u==v;
}
void mer(int u,int v){
u=fa(u);v=fa(v);
f[u]=v;
}
int main(){
int x,y;
int xx;
cin>>xx;
while(xx--){
cin>>n>>m;
int s=0;
init();
for(int i=0;i<m;i++){
cin>>x>>y;
mer(x,y);
}
for(int i=1;i<=n;i++){
if(fa(i)==i) s++;
}
cout<<s<<endl;
}
return 0;
}