题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=66964#problem/C
题目大意:有N个人参加聚会,你要为他们安排桌子,有M对朋友关系,间接的朋友也算朋友,同一桌上的人必须全为朋友,问最少需要几桌?
解体思路:并查集模板题,有关系的合并,最后询问联通块个数。(练练1A吧)
代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
const int maxn=1005;
int fa[maxn];
int T,n,m;
bool use[maxn];
int find(int x){
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
int ans;
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) {
fa[i]=i;
use[i]=0;
}
for(int i=1;i<=m;i++){
int a,b;
scanf("%d%d",&a,&b);
fa[find(a)]=find(b);
}
ans=0;
for(int i=1;i<=n;i++)
if(use[find(i)]==0){
ans++;use[fiAnd(i)]=1;
}
cout<<ans<<endl;
}
return 0;
}