统计有多少个集合,只要fa[i] == i;就可以算作是一个单独的集合。
#include <cstdio>
#include <iostream>
const int MAX = 1e3 + 5;
int fa[MAX], r[MAX];
void init(int n)
{
for (int i = 1; i <= n; ++i)
{
fa[i] = i;
r[i] = 1;
}
}
int find(int x)
{
return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void unite(int a, int b)
{
a = find(a);
b = find(b);
if (a == b)
return ;
if (r[a] < r[b])
{
fa[a] = b;
}
else
{
fa[b] = a;
if (r[a] == r[b])
r[a]++;
}
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n, m;
scanf("%d%d", &n, &m);
init(n);
for (int i = 1; i <= m; ++i)
{
int a, b;
scanf("%d%d", &a, &b);
unite(a, b);
}
int res = 0;
for (int i = 1; i <= n; ++i)
{
if (fa[i] == i)
res++;
}
printf("%d\n", res);
}
return 0;
}