1107. Social Clusters (30)
When register on a social network, you are always asked to specify your hobbies in order to find some potential friends with the same hobbies. A "social cluster" is a set of people who have some of their hobbies in common. You are supposed to find all the clusters.
Input Specification:
Each input file contains one test case. For each test case, the first line contains a positive integer N (<=1000), the total number of people in a social network. Hence the people are numbered from 1 to N. Then N lines follow, each gives the hobby list of a person in the format:
Ki: hi[1] hi[2] ... hi[Ki]
where Ki (>0) is the number of hobbies, and hi[j] is the index of the j-th hobby, which is an integer in [1, 1000].
Output Specification:
For each case, print in one line the total number of clusters in the network. Then in the second line, print the numbers of people in the clusters in non-increasing order. The numbers must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:8 3: 2 7 10 1: 4 2: 5 3 1: 4 1: 3 1: 4 4: 6 8 1 5 1: 4Sample Output:
3 4 3 1
#include<iostream> #include<vector> #include<algorithm> #include<cstdio> #include<set> using namespace std; vector<int> par; vector<int> count1; vector<int> num; int cnt; struct node{ vector<int> sNum; }; vector<node> xq(1005); int find(int x){ if(x == par[x]) return x; else return par[x] = find(par[x]); } bool cmp(int a,int b){ return a>b; } void merge(int a,int b){ int x = find(a); int y = find(b); if(x == y) return ; --cnt; if(count1[x]<count1[y]){ par[x] = y; num[y] += num[x]; } else if(count1[x]>count1[y]){ par[y] = x; num[x] += num[y]; } else{ par[y] = x; num[x] += num[y]; count1[x]++; } } int main(){ int n,a,m,max = 0; cin>>n; par.resize(n); num.resize(n); count1.resize(n); for(int i = 0;i<n;++i){ par[i] = i; num[i] = 1; } cnt = n; for(int i = 0;i<n;++i){ scanf("%d:",&m); for(int j = 0;j<m;++j){ scanf("%d",&a); if(a>max) max = a; xq[a].sNum.push_back(i); } } for(int i = 0;i<=max;++i){ if(xq[i].sNum.size() != 0){ for(int j = 1;j<xq[i].sNum.size();++j) merge(xq[i].sNum[0],xq[i].sNum[j]); } } set<int> res; for(int i = 0;i<n;++i) res.insert(find(i)); vector<int> res2; set<int>::iterator iter = res.begin(); for(;iter != res.end();++iter) res2.push_back(num[find(*iter)]); cout<<cnt<<endl; sort(res2.begin(),res2.end(),cmp); cout<<res2[0]; for(int i = 1;i<cnt;++i) cout<<" "<<res2[i]; cout<<endl; return 0; }