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
题意:有n个人,每个人都有兴趣爱好,用1,2, ... ,n 来表示兴趣爱好, 现在给你每个人的兴趣好爱, 有相同兴趣爱好的人算一组,问你一个可以分成多少组,
并降序输出每个小团体的人数。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int N = 1e3+100;
int fa[N],a[N],b[N];
vector<int>vec[N];
int find(int x)
{
int r=x;
while(fa[r]!=r) r=fa[r];
int i=x,j;
while(i!=r) {
j=fa[i];
fa[i]=r;
i=j;
}
return r;
}
int main()
{
int n,i,j,fx,fy,x,y;
int T,num;
scanf("%d",&n);
for(i=1;i<=n;i++) {
fa[i]=i;
scanf("%d:",&T);
while(T--) {
scanf("%d",&num);
vec[num].push_back(i);
}
}
for(i=1;i<=1000;i++) {
if(vec[i].size()<2) continue;
fx=find(vec[i][0]);
for(j=1;j<vec[i].size();j++) {
fy=find(vec[i][j]);
if(fx!=fy) fa[fy]=fx;
}
}
for(i=1;i<=n;i++) {
a[find(i)]++;
}
int k=0;
for(i=1;i<=n;i++) {
if(a[i]) {
b[k++]=a[i];
}
}
sort(b,b+k,greater<int>());
printf("%d\n",k);
for(i=0;i<k;i++) {
if(i) printf(" ");
printf("%d",b[i]);
}
printf("\n");
return 0;
}