题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1213
非常基础的并查集,先假设需要n张桌子,每次合并2个集合,就减少一张桌子。
#include <cstdio>
#include <iostream>
#define maxn 100005
using namespace std;
int fat[maxn],t,n,m,a,b;
int find(int x)
{
return x==fat[x]?x:fat[x]=find(fat[x]); //带路径压缩
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
int ans=n;
for(int x=0;x<=n;x++)
fat[x]=x;
while(m--)
{
scanf("%d%d",&a,&b);
int a1=find(a);
int b1=find(b);
if(a1!=b1)
ans--,fat[a1]=b1; //2个合并集合,减少一张桌子
}
printf("%d\n",ans);
}
}