需要多少桌子
题目描述
ACM集训队有n个人一起集训,有些人是相互认识的。认识的人想坐在一起讨论题目,不想跟不认识的人坐一起。例如张三认识李四,李四认识王五,那么张三、李四、王五会坐在一张桌子上。现在已知相互认识的人的情况,求总共需要多少张桌子,使得所有相互认识的人都坐在同一张桌子上?
输入格式
第一行为一个正整数T,表示有T个测试例子(1<=T<=100)。
每个测试例子的第一行为两个正整数n和m(1<=n,m<=1000),n表示集训队的总人数,队员标记从1到n;m表示已知的相互认识的队员情况总数。后面m行,每行两个正整数a和b(1<=a,b<=n),表示队员a和b相互认识。
输出格式
对于每个测试例子,输出总共需要多少张桌子,使得所有相互认识的人都坐在同一张桌子上。
样例输入
2
6 4
1 2
2 3
3 4
5 6
6 2
1 2
3 4
样例输出
2
4
思路:
并查集,我觉得写得非常好的文章链接:https://zhuanlan.zhihu.com/p/93647900
#include<bitsdc++.h>
using namespace std;
int fa[10005];
int find(int x){
if(x==fa[x]) return x;
return fa[x]=find(fa[x]);
}
void merge(int x,int y){
fa[find(x)]=find(y);
}
main(){
int t;
cin>>t;
while(t--){
int n,m;
int ans=0;
cin>>n>>m;
for(int i=1;i<=n;i++){
fa[i]=i;
}
int a,b;
for(int i=0;i<m;i++){
cin>>a>>b;
merge(a,b);
}
for(int i=1;i<=n;i++){
if(find(i)==i){
ans++;
}
}
cout<<ans<<endl;
}
}