#include <iostream>
using namespace std;
const int MAXN = 32768;
int P[MAXN], Rank[MAXN], Num[MAXN];
int n, m, ans;
void Make_Set(int n)
{
int i;
for (i=0; i<n ; i++)
{
P[i] = i;
Rank[i] = 0;
Num[i] = 1;
}
}
int Find_Set(int x)
{
if (x != P[x])
P[x] = Find_Set(P[x]);
return P[x];
}
void Union_Set(int x, int y)
{
int Rx, Ry;
Rx = Find_Set(x);
Ry = Find_Set(y);
if (Rank[Rx] > Rank[Ry])
{
P[Ry] = Rx;
Num[Rx] += Num[Ry];
}
else if (Rank[Ry] > Rank[Rx])
{
P[Rx] = Ry;
Num[Ry]+= Num[Rx];
}
else if (Rx != Ry)
{
P[Ry] = Rx;
Num[Rx] += Num[Ry];
Rank[Rx]++;
}
}
int main()
{
int i, j, k, cnt, first;
do {
scanf("%d%d", &n, &m);
if (n == 0) break;
Make_Set(n);
for (i=1; i<=m; i++)
{
scanf("%d%d", &cnt, &first);
for (j=1; j<cnt; j++)
{
scanf("%d", &k);
Union_Set(first, k);
}
}
i = Find_Set(0);
ans = Num[i];
printf("%d/n", ans);
}while(true);
return 0;
}
并查集的简单应用 ZOJ1789 The Suspects
本文详细介绍了并查集算法的基本概念、实现原理及其在解决特定问题中的应用。通过具体的代码示例,展示了如何使用并查集进行数据集合的查找与合并操作,特别适用于处理大量元素之间的连接性问题。

被折叠的 条评论
为什么被折叠?



