【PAT甲级】1107 Social Clusters (30分)(非递归并查集)

题意:

输入一个正整数N(<=1000),表示人数,接着输入N行每行包括一个他的爱好数量:和爱好的序号。拥有相同爱好的人们可以默认他们在同一个俱乐部,输出俱乐部的数量并从大到小输出俱乐部的人数(不同俱乐部的两个人的爱好一定不相同)。

AAAAAccepted code:

 1 #define HAVE_STRUCT_TIMESPEC
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 vector<int>v[1007],st;
 5 int fa[1007];
 6 int a[1007];
 7 int find_(int x){
 8     int k,j,r;
 9     r=x;
10     while(r!=fa[r])
11         r=fa[r];
12     k=x;
13     while(k!=r){
14         j=fa[k];
15         fa[k]=r;
16         k=j;
17     }
18     return r;
19 }
20 int main(){
21     ios::sync_with_stdio(false);
22     cin.tie(NULL);
23     cout.tie(NULL);
24     int n;
25     cin>>n;
26     st.resize(n+1);
27     for(int i=1;i<=n;++i)
28         fa[i]=i;
29     for(int i=1;i<=n;++i){
30         int x;
31         cin>>x;
32         cin.ignore();
33         for(int j=1;j<=x;++j){
34             int y;
35             cin>>y;
36             v[i].push_back(y);
37         }
38     }
39     for(int i=1;i<=n;++i)
40         for(auto it:v[i])
41             if(!a[it])
42                 a[it]=i;
43             else{
44                 int x=find_(i);
45                 int y=find_(a[it]);
46                 if(x!=y)
47                     fa[x]=y;
48             }
49     for(int i=1;i<=n;++i)
50         ++st[find_(i)];
51     int cnt=0;
52     for(int i=1;i<=n;++i)
53         if(st[i])
54             ++cnt;
55     cout<<cnt<<"\n";
56     sort(st.rbegin(),st.rend());
57     for(int i=0;i<cnt;++i){
58         cout<<st[i];
59         if(i<cnt-1)
60             cout<<" ";
61     }
62     return 0;
63 }

 

posted @ 2019-12-05 14:20  sewage  阅读(149)  评论(0编辑  收藏  举报