#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
最新推荐文章于 2014-07-08 20:16:43 发布