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)