【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 }
保持热爱 不懈努力
不试试看怎么知道会失败呢(划掉)
世上无难事 只要肯放弃(划掉)