水题并查集。
合并相同颜色的球,求不同集合数量。
#include<cstdio>
const int maxn=10010;
int r[maxn],n,m,ans,T;
void init()
{
for(int i=0;i<=n;i++)
r[i]=i,num[i]=1;
}
int root(int a)
{
if(r[a]==a) return a;
return r[a]=root(r[a]);
}
void merge(int a,int b)
{
int ra=root(a),rb=root(b);
if(ra!=rb)
{
ans--;
r[ra]=rb;
}
}
int main()
{
int a,b;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
init();
ans=n;
while(m--)
{
scanf("%d%d",&a,&b);
merge(a,b);
}
printf("%d\n",ans);
}
return 0;
}