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<stdio.h> #include<string> #include<queue> #include<algorithm> #include<string.h> #include<vector> #include<map> #include<math.h> using namespace std; int hobby[1005]={0}; int father[1005]={0}; int cnt[1005]={0}; bool cmp(int x,int y) { return x>y; } vector<int> node[1005]; int findpapa(int x) { if(father[x]==x) return x; else { int zz=findpapa(father[x]); father[x]=zz; return zz; } } int main() { int n; cin>>n; for(int i=1;i<=n;i++) { int tmp; cin>>tmp; getchar(); for(int j=0;j<tmp;j++) { int zz; cin>>zz; node[i].push_back(zz); } } for(int i=0;i<1004;i++) father[i]=i; for(int i=1;i<=n;i++) { for(int j=0;j<node[i].size();j++) { int tmp=node[i][j]; if(hobby[tmp]==0) hobby[tmp]=father[i]; else { father[father[i]]=hobby[tmp]; findpapa(i); } } } for(int i=1;i<=n;i++) findpapa(i); for(int i=1;i<=n;i++) cnt[father[i]]++; sort(cnt+1,cnt+1+n,cmp); int p=1; while(cnt[p]!=0) p++; p--; cout<<p<<endl; int flag=0; for(int i=1;i<=p;i++) { if(flag==1) cout<<' '; flag=1; cout<<cnt[i]; } return 0; }