#include <bits/stdc++.h>
#include <unordered_map>
using namespace std;
typedef long long ll;
const int maxn = 1e3 + 5, inf = 1e9;
vector<vector<int>> hob(maxn);
int root[maxn];
int get_root(int x) //带路径压缩的简洁写法
{
if (x != root[x])
root[x] = get_root(root[x]);
return root[x];
}
void merge(int a, int b)
{
int ra = get_root(a), rb = get_root(b);
if (ra != rb)
root[ra] = rb;
}
int main()
{
int n, k, tmp;
cin >> n;
for (int i = 0; i < n; i++)
{
scanf("%d:", &k);
root[i] = i;
while (k--)
{
cin >> tmp;
hob[tmp].push_back(i);
}
}
for (auto &h:hob)
for (int i = 1; i < h.size(); i++)
merge(h[0], h[i]); //注意这里不需要两两合并,所有结点只跟首结点合并就行
unordered_map<int, int> cnt;
vector<int> ans;
for (int i = 0; i < n; i++)
cnt[get_root(i)]++; //统计每个cluster包含的成员数
for (auto &it : cnt)
ans.push_back(it.second);
sort(ans.begin(), ans.end(), [](int a, int b) {return a > b; });
cout << ans.size() << endl;
for (int i = 0; i < ans.size(); i++)
{
cout << ans[i];
if (i != ans.size() - 1)
cout << " ";
}
return 0;
}
06-29
278
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
09-28
136
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
09-16
151
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)