#include <iostream>
using namespace std;
//题意:认识的朋友可以坐在一个桌子边,问有多少组
//并差集
#define NSIZ 1100
int parent[NSIZ];
int bc_rank[NSIZ];
void makeSet(int m)
{
for(int i = 0; i <= m; ++i)
{
parent[i] = i;
bc_rank[i] = 1;
}
}
int findSet(int x)
{
if(x != parent[x])
{
parent[x] = findSet(parent[x]);
}
return parent[x];
}
void unsionSet(int x, int y)
{
x = findSet(x), y = findSet(y);
if (x != y)
{
if (bc_rank[x] > bc_rank[y])
{
bc_rank[x] += bc_rank[y];
parent[y] =x;
}
else
{
bc_rank[y] += bc_rank[x];
parent[x] = y;
}
}
}
int main()
{
int t, n, m, i, sum;
int a, b;
while (scanf("%d", &t) != EOF)
{
while (t--)
{
scanf("%d %d", &n, &m);
makeSet(n);
for (i = 0;i < m; ++i)
{
scanf("%d %d", &a, &b);
unsionSet(a, b);
}
sum = n;
for (i = 1;i <= n; ++i)
{
if (parent[i] != i)
{
sum--;
}
}
printf("%d\n", sum);
}
}
return 0;
}
hdu1213How Many Tables【并差集】
最新推荐文章于 2022-11-07 14:02:50 发布
