题目:https://pintia.cn/problem-sets/994805342720868352/problems/994805361586847744
1 #include<iostream> 2 #include<vector> 3 #include<map> 4 #include<algorithm> 5 using namespace std; 6 7 int father[1010],habby[1010];//表示喜欢habby的人的编号 8 9 void init(int n) { 10 for(int i = 1; i <= n; ++i) 11 father[i] = i; 12 } 13 14 int findfather(int a) { 15 int b = a; 16 while(a != father[a]) 17 a = father[a]; 18 while(b != father[b]) { 19 int t = b; 20 b = father[b]; 21 father[t] = a; 22 } 23 return a; 24 } 25 26 void Union(int a,int b) { 27 int fa = findfather(a); 28 int fb = findfather(b); 29 if(fa != fb) 30 father[fa] = fb; 31 } 32 bool cmp(pair<int,int> a,pair<int,int> b){ 33 return a.second > b.second; 34 } 35 int main() { 36 int n,k,h; 37 cin>>n; 38 init(n); 39 for(int i = 1; i <= n; ++i) { 40 scanf("%d:",&k); 41 for(int j = 0; j < k; ++j) { 42 scanf("%d",&h); 43 if(habby[h] == 0) 44 habby[h] = i; 45 Union(i,habby[h]); 46 } 47 } 48 map<int,int> ans; 49 for(int i = 1; i <= n; ++i) 50 ans[findfather(i)]++; 51 printf("%d\n",ans.size()); 52 vector<pair<int,int>> v(ans.begin(),ans.end()); 53 sort(v.begin(),v.end(),cmp); 54 for(int i = 0; i < v.size(); ++i) { 55 if(i != 0) printf(" "); 56 printf("%d",v[i].second); 57 } 58 return 0; 59 }