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
//1107. Social Clusters(30)
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a, int b) {
return a > b;
}
int f[1001] = { 0 };
int judge[1001] = { 0 };
int h[1001] = { 0 };
int father(int x) {
if (x != f[x])
f[x] = father(f[x]);
return f[x];
}
void Union(int x, int y) {
int fx = father(x);
int fy = father(y);
if (fx != fy)
f[fx] = fy;
return;
}
int main() {
int n, k, s, count = 0;
cin >> n;
for (int i = 1; i <= 1001; i++) {
f[i] = i;
}
for (int i = 1; i <= n; i++) {
scanf("%d:", &k);
for (int j = 1; j <= k; j++) {
cin >> s;
if (h[s] == 0)
h[s] = i;
Union(h[s], i);
}
}
for (int i = 1; i <= n; i++) {
int x = father(i);
if (judge[x])
judge[x]++;
else {
judge[x]++;
count++;
}
}
cout << count << endl;
sort(judge, judge + n + 1, cmp);
cout << judge[0];
for (int i = 1; i <count; i++)
cout << " "<< judge[i] ;
return 0;
}