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;
}
#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;
}
相关文章推荐
- PAT程序设计考题——甲级1077(Kuchiguse ) C++实现
- PAT程序设计考题——甲级1058(A+B in Hogwarts ) C++实现
- PAT程序设计考题——甲级1017(Queueing at Bank ) C++实现
- PAT程序设计考题——甲级1036( Boys vs Girls ) C++实现
- PAT程序设计考题——甲级1057( stock 分块查询) C++实现
- PAT程序设计考题——甲级1082( Read Number in Chinese ) C++实现
- PAT程序设计考题——甲级1014( Waiting in Line ) C++实现
- PAT程序设计考题——甲级1066(Root of AVL Tree ) C++实现
- PAT程序设计考题——甲级1002(A+B for Polynomials ) C++实现
- PAT程序设计考题——甲级1030(Travel Plan) C++实现
- PAT程序设计考题——甲级1020( Tree traverse ) C++实现
- PAT程序设计考题——甲级1031(Hello World for U) C++实现
- PAT程序设计考题——甲级1027(Colors in Mars ) C++实现
- PAT程序设计考题——甲级1008( elevator) C++实现
- PAT程序设计考题——甲级1005( Spell It Right ) C++实现
- PAT程序设计考题——甲级1007 (最大连续子序列和) C++实现
- PAT程序设计考题——甲级1003(Emergency ) C++实现
- PAT程序设计考题——甲级1040 (最长回文串) C++实现
- PAT程序设计考题——甲级1042(洗牌机) C++实现
- PAT程序设计考题——甲级1043(Is It a Binary Search Tree ) C++实现