//并查集之后,如何得出有几个集合
//就是扫描一遍有几个par[i] == i的
#include<iostream>
#include<cstdio>
#include<cstring>
const int maxn = 1005;
using namespace std;
int par[maxn],rot[maxn];
void Init()
{
for(int i = 0; i < maxn; i++)
{
par[i] = i;
rot[i] = 0;
}
}
int Find(int x)
{
if(x == par[x])
return x;
int t = Find(par[x]);
return par[x] = t;
}
void Union(int x, int y)
{
x = Find(x);
y = Find(y);
if(x != y)
{
if(rot[x]>rot[y])
{
par[y] = x;
}
else
{
par[x] = y;
rot[y]++;
}
}
}
int main()
{
int t,n,m,x,y;
scanf("%d",&t);
while(t--)
{
Init();
scanf("%d%d",&n,&m);
for(int i = 1; i <= m; i++)
{
scanf("%d%d",&x,&y);
Union(x,y);
}
int cnt = 0;
for(int i = 1; i <= n; i++)
if(par[i] == i)
cnt++;
printf("%d\n",cnt);
}
return 0;
}
并差集_HDU_1213
最新推荐文章于 2015-08-28 13:05:47 发布