您的位置:首页 > 其它

PAT (Advanced Level) 1107. Social Clusters (30)

2016-07-05 10:07 411 查看
简单并查集。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;

const int maxn=1000+10;
int fa[maxn];
int num[maxn];
int n;
vector<int>g[maxn],ans;

int f(int x)
{
if(x!=fa[x]) fa[x]=f(fa[x]);
return fa[x];
}

int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int num; scanf("%d:",&num);
while(num--)
{
int hob; scanf("%d",&hob);
g[hob].push_back(i);
}
}

for(int i=0;i<=n;i++) fa[i]=i;

for(int i=1;i<=1000;i++)
{
if(g[i].size()==0) continue;
int u=f(g[i][0]);
for(int j=1;j<g[i].size();j++)
{
int v=f(g[i][j]);
if(u!=v) fa[v]=u;
}
}

for(int i=1;i<=n;i++) f(i);

memset(num,0,sizeof num);
for(int i=1;i<=n;i++) num[f(i)]++;
for(int i=1;i<=n;i++) if(num[i]>0) ans.push_back(num[i]);

sort(ans.begin(),ans.end());
printf("%d\n",ans.size());
for(int i=ans.size()-1;i>=0;i--)
{
printf("%d",ans[i]);
if(i>0) printf(" ");
else printf("\n");
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: