您的位置:首页 > 编程语言 > C语言/C++

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

2017-07-03 19:22 411 查看
点击打开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;

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