PAT A1107 Social Clusters(30 分)-----------并查集1

参考: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;
}

猜你喜欢

转载自blog.csdn.net/luoshiyong123/article/details/82084746
今日推荐