PAT甲级 1107. Social Clusters

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Mr0cheng/article/details/79549523

并查集,先查找再合并

#include<bits/stdc++.h>
using namespace std;
const int maxn=1000+10;
int father[maxn],cnt[maxn];

void init(){
    for(int i=0;i<maxn;++i)father[i]=i; //n->maxn
}

int find(int x){
    if(father[x]==x)return x;
    father[x]=find(father[x]);
    return father[x];
}

int main(){
    int n,k,t,rtx,rty;
    scanf("%d",&n);
    init();
    for(int i=0;i<n;++i){
        scanf("%d: ",&k);
        for(int j=0;j<k;++j){
            scanf("%d",&t);
            if(j==0){
                rtx = find(t);
            }else{
                rty = find(t);
                if(rtx!=rty){
                    father[rty]=rtx;
                    cnt[rtx]+=cnt[rty];
                }
            }
        }
        ++cnt[rtx];
    }
    vector<int> ans;
    for(int i=1;i<maxn;++i){   //n->maxn
        if(father[i]==i && cnt[i]!=0){
            ans.push_back(cnt[i]);
        }
    }
    sort(ans.begin(),ans.end());
    printf("%d\n",ans.size());
    for(vector<int>::reverse_iterator it = ans.rbegin();it!=ans.rend();++it){
        if(it==ans.rbegin())printf("%d",*it);
        else printf(" %d",*it);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Mr0cheng/article/details/79549523