1107 Social Clusters (30 分)难度: 中 / 知识点: 并查集

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1107 Social Clusters (30 分)难度: 中 / 知识点: 并查集相关的知识,希望对你有一定的参考价值。


https://pintia.cn/problem-sets/994805342720868352/problems/994805361586847744
很不错的一个并查集的操作。你会发现我们需要处理的是对于每一个人,它的所有的兴趣都是在一个集合中的故将所有的集合都合并。

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
map<int,int>mp;
int n,m,p[N],cnt[N],x;
set<int>st;//是用来去重的存一下,所有的感兴趣的点
int find(int x)

    if(x!=p[x]) p[x]=find(p[x]);
    return p[x];

int main(void)

    cin>>n;
    for(int i=1;i<=1000;i++) p[i]=i;
    for(int i=1;i<=n;i++)
    
        vector<int>ve;
        scanf("%d:",&m);
        for(int j=0;j<m;j++)
        
            cin>>x; ve.push_back(x);
            st.insert(x);
        
        for(int j=1;j<ve.size();j++)//将这些点(兴趣)合并为一个集合
        
            if(p[find(ve[j])]!=find(ve[0]))
            
                cnt[find(ve[0])]+=cnt[find(ve[j])];
                p[find(ve[j])]=find(ve[0]);
            
        
        cnt[find(ve[0])]++;//将这个人加入到集合中
    
    vector<int>ans;
    for(auto i=st.begin();i!=st.end();i++) 
        if(!mp[find(*i)]) ans.push_back(cnt[find(*i)]),mp[find(*i)]=1;
    sort(ans.begin(),ans.end());
    cout<<ans.size()<<endl;
    for(int i=ans.size()-1;i>=0;i--) 
    
        if(ans[i]) cout<<ans[i];
        if(i) cout<<" ";
    
    return 0;

以上是关于1107 Social Clusters (30 分)难度: 中 / 知识点: 并查集的主要内容,如果未能解决你的问题,请参考以下文章

PAT Advanced 1107 Social Clusters (30) [并查集]

1107. Social Clusters (30)

A1107 Social Clusters (30分)

骞舵煡闆嗏€斺€擜1107.Social Clusters(30)

1107 Social Clusters (30 分)难度: 中 / 知识点: 并查集

PAT_A1107#Social Clusters