hdu 1213"How Many Tables"
题目:有n个人一起吃饭,有些人相互认识。认识的人想做坐在一起,不想跟陌生人坐。例如 A认识 B,B认识 C,那么A、B、D会坐在一张桌子上。
分析:一张桌子是一个集合,合并朋友关系,然后统计数量即可。下面是代码并查集的操作:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1050;
int s[maxn];
void init_set(){//初始化
for(int i=1; i<=maxn; i++)
s[i]=i;
}
int find_set(int x){//查找
return x ==s[x]? x:find_set(s[x]);
//是否被填充,是则下一个,否,此位置为待填充位置
}
int union_set(int x,int y){//合并
x =find_set(x);
y =find_set(y);
if(x!= y) s[x] =s[y];
}
int main(){
int t,n,m,x,y;//m:多少组关系,n:有多少人
cin>>t;
while(t--){
cin>>n>>m;
init_set();
for(int i=1; i<=m;i++){
cin>>x>>y;
union_set(x,y);
}
int ans=0;
for(int i=1;i<=n;i++)
if(s[i] ==i)
ans++;
cout<<ans<<endl;
}
return 0;
}