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 (≤), 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 (>) is the number of hobbies, and [ 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<bits/stdc++.h> using namespace std; const int maxn=1010; int hobbies[maxn]; int father[maxn]; int isRoot[maxn]; bool cmp(int a,int b){ return a>b; } 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 x=findFather(a); int y=findFather(b); if(x!=y){ father[x]=y; } } int main(){ int n,m,id,temp; scanf("%d",&n); for(int i=1;i<maxn;i++){ father[i]=i; } for(int i=1;i<=n;i++){ scanf("%d: ",&m); for(int j=0;j<m;j++){ scanf("%d",&temp); if(hobbies[temp]==0){ hobbies[temp]=i;//是谁的爱好 } Union(i,hobbies[temp]);//相同爱好的人,放在一块;而不是把相同的爱好放在一块 } } for(int i=1;i<=n;i++){ isRoot[findFather(i)]++; } int numRoot=0; for(int i=1;i<=n;i++){ if(isRoot[i]!=0){ numRoot++; } } printf("%d\n",numRoot); sort(isRoot,isRoot+n+1,cmp); for(int i=0;i<numRoot;i++){ if(i<numRoot-1){ printf("%d ",isRoot[i]); } else{ printf("%d\n",isRoot[i]); } } return 0; }