#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define N 30100
int father[N] = { 0 };
int rank1[N] = { 0 }, num[N] = { 0 };
int find(int x)//并查集的find找老子
{
if (x != father[x])
father[x] = find(father[x]);
return father[x];
}
void unionset(int x, int y)//并查集的并
{
x = find(x);
y = find(y);
if (x == y)return;
if (rank1[x]>rank1[y])//rank为数的深度
{
father[y] = x;//大树作为小树的父亲
num[x] += num[y];
}
else
{
if (rank1[x] == rank1[y])
{
rank1[y]++;//来一次了所以树的深度加一次
}
father[x] = y;
num[y] += num[x];
}
}
int main()
{
int n, m, i, j, k, t, pos0, t0, x, y;
while (1)
{
cin >> n >> m;
if (n == 0 && m == 0)break;
memset(rank1, 0, sizeof(rank1));
for (i = 0; i<n; i++)
{
father[i] = i;
num[i] = 1;
}
for (i = 0; i<m; i++)
{
cin >> k >> t0;
for (j = 1; j<k; j++)
{
cin>>t;
x = find(t0);
y = find(t);
unionset(x, y);
}
}
pos0 = find(0);
cout<< num[pos0]<<endl;
}
return 0;
}
poj1611 简单并查集
最新推荐文章于 2023-03-30 15:58:00 发布