跟1232不一样的地方是最后的结果不用减一。
#include<stdio.h>
int mark[1005],rank[1005];
int find(int x)
{
while(x!=mark[x])
x=mark[x];
return x;
}
void Union(int x,int y)
{
x=find(x);
y=find(y);
if(x==y)
return ;
if(rank[x]>=rank[y])
{
mark[y]=mark[x];
rank[x]+=rank[y];
}
else
{
mark[x]=mark[y];
rank[y]+=rank[x];
}
return ;
}
int main()
{
int x,y;
int T,i;
int n,m;
int ans;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(i=0;i<=n;i++)
{
mark[i]=i;
rank[i]=1;
}
for(i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
Union(x,y);
}
ans=0;
for(i=1;i<=n;i++)
{
if(mark[i]==i)
ans++;
}
printf("%d\n",ans);
}
return 0;
}