参考:https://blog.csdn.net/a664607530/article/details/73991827
总结:
1.并查集查找是否在一个根节点下find函数,这道题用f数组保存根节点,如果这个是最终根节点f[i]=-1,如果不是f[i]就是当前i的父亲节点,via[i]表示i爱好的父亲节点,cnt[i]表示-----每一个最终根节点有多少个叶节点
代码:
#include<iostream>
#include<functional>
#include<algorithm>
using namespace std;
int f[1000];
int via[1000];
int cnt[1000];
int find(int gg)
{
return f[gg]==-1 ? gg :find(f[gg]);
}
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
f[i] = -1;
for (int i = 1; i <= n; i++)
{
int k;
scanf_s("%d:",&k);
for (int j = 0; j < k; j++)
{
int s;
cin >> s;
if (!via[s]){
via[s] = i;
}
else
{
int p1 = find(i);
int p2 = find(via[s]);
if (p1 != p2)f[p1] = p2;
}
}
}
int sum = 0;
for (int i = 1; i <= n; i++)
{
if (f[i] == -1)sum++;
cnt[find(i)]++;
}
sort(cnt, cnt + n + 1, greater<int>());
cout << sum << endl;
for (int i = 0; i < sum; i++)
{
cout << cnt[i];
if (i != sum - 1)cout << " ";
}
return 0;
}