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: 4
Sample Output:
3
4 3 1
#include<iostream> #include<vector> #include<algorithm> using namespace std; int hobbies[1001],father[1001],isRoot[1001]; void init() { for(int i=1;i<1001;i++) father[i]=i; } int findFather(int x) { int a=x; while(x!=father[x]) x=father[x]; //路径压缩 while(a!=father[a]) { int z=a; a=father[a]; father[z]=x; } return x; } void Union(int a,int b) { int fa=findFather(a); int fb=findFather(b); if(fa!=fb) father[fa]=fb; } int main() { int n; scanf("%d",&n); init(); for(int i=1;i<n+1;i++) { int k; scanf("%d:",&k); for(int j=0;j<k;j++) { int t; scanf("%d",&t); if(hobbies[t]==0) hobbies[t]=i;//记录这是谁的爱好 Union(i,hobbies[t]); } } for(int i=1;i<n+1;i++) { isRoot[findFather(i)]++; } int cnt=0; for(int i=1;i<n+1;i++) { if(isRoot[i]!=0) cnt++; } printf("%d ",cnt); sort(isRoot,isRoot+n+1,greater<int>()); printf("%d",isRoot[0]); for(int i=1;i<cnt;i++) { printf(" %d",isRoot[i]); } return 0; }