题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1213
题意: 首先输入一个数T为案例数,每一个案例的第一行输入一个N和一个M,N代表有多少个人(编号从1到N),M表示有几组人是朋友,随后的M行,表示谁和谁是朋友。注意朋友的朋友也互为朋友,只有朋友才能坐在同一个桌子,求需要的最少的桌子数。
代码:
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <string>
#include <stdlib.h>
#include <algorithm>
using namespace std;
const int maxn=1000+5;
int p[maxn],flag[maxn];
void init()//初始化
{
for(int i=0 ;i<maxn; i++)
p[i]=i;
}
int find_(int x)//并查集
{
return p[x]==x ? x : p[x]=find_(p[x]);
}
int main()
{
int T,N,M,a,b,x,y,ans;
scanf("%d",&T);
while(T--)
{
ans=0;
memset(flag,0,sizeof(flag));
init();
scanf("%d%d",&N,&M);
for(int i=0; i<M; i++)
{
scanf("%d%d",&a,&b);
x=find_(a);
y=find_(b);
p[x]=y;
}
for(int i=1; i<=N; i++)
{
x=find_(i);
if(flag[x]==0)
{
flag[x]=1;
ans++;
}
}
printf("%d\n",ans);
}
return 0;
}