PAT程序设计考题——甲级1107( Social clusters并查集) C++实现

来源:互联网 发布:ubuntu 14.04 源 2016 编辑:程序博客网 时间:2024/06/05 22:48

点击打开pat链接

#include<iostream>
#include<math.h>
#include<algorithm>
#include<queue>
#include<map>
#include<stack>
#include<string>
#include<vector>
using namespace std;
#define INF 100000000
#define maxn 100010
int father[1010];
int isroot[1010]={0};
int coarse[1010]={0};
void init(int n)
{
 for(int i=0;i<=n;i++)
 {
  father[i]=i;
 }
}
int findfather(int x)
{ int a=x;
while(x!=father[x])
{
 x=father[x];
}
while(a!=father[a])
{int z=a;
 a=father[a];
 father[a]=x;
}
return x;
}
void Union(int x,int y)
{
 int m=findfather(x);
 int n=findfather(y);
 if(m!=n)  father[m]=n;
}
bool cmp(int a,int b)
{
 return a>b;
}
int main()

 int n,k,hobby;
 cin>>n;init(n);
 for(int i=1;i<=n;i++)
 {
  scanf("%d:",&k);
  for(int j=0;j<k;j++)
  {
   cin>>hobby;
 if(coarse[hobby]==0) coarse[hobby]=i;
 Union(i,father[coarse[hobby]]);
   }
   
 }//主体的功能已经结束
 for (int i=1;i<=n;i++)
 {
  isroot[findfather(father[i])]++;//同时统计人数
 }
    int num=0;
 for (int i=1;i<=n;i++)
 {
 if(isroot[i]!=0) num++;
 }
 cout<<num<<endl;
 sort(isroot+1,isroot+n+1,cmp);
 for(int i=1;i<=num;i++)
 {
  cout<<isroot[i];
  if(i<=num-1) cout<<" ";
 }
 return 0;
}


阅读全文
0 0
原创粉丝点击