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:
K~i~: h~i~[1] h~i~[2] ... h~i~[K~i~]
where K~i~ (>0) is the number of hobbies, and h~i~[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 <stdio.h> #include <stdlib.h> int n,m,d,c,f[1001],mp[1001][1001],num[1001],ans[1001]; void init() { for(int i = 1;i <= n;i ++) { f[i] = i; } } int getf(int x) { if(x != f[x])f[x] = getf(f[x]); return f[x]; } void mer_(int x,int y) { int xx = getf(x),yy = getf(y); f[xx] = yy; } int cmp(const void *a,const void *b) { return *(int *)b - *(int *)a; } int main() { scanf("%d",&n); init(); for(int i = 1;i <= n;i ++) { scanf("%d:",&m); for(int j = 1;j <= m;j ++) { scanf("%d",&d); mp[i][d] = 1; for(int k = 1;k < i;k ++) { if(mp[k][d])mer_(k,i); } } } for(int i = 1;i <= n;i ++) { int e = getf(i); num[e] ++; } for(int i = 1;i <= n;i ++) { if(num[i])ans[c ++] = num[i]; } qsort(ans,c,sizeof(int),cmp); printf("%d\n",c); for(int i = 0;i < c;i ++) { if(i)putchar(' '); printf("%d",ans[i]); } }