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.
intgetFather(int *father, int x){ if (father[x] == x) return x; returngetFather(father, father[x]); }
intmain(){ int n = 0; scanf("%d", &n); vector<vector<int> > hobbies(1001); for (int i = 1; i <= n; i++) { int k = 0; scanf("%d:", &k); for (int j = 0; j < k; j++) { int t = 0; scanf("%d", &t); hobbies[t].push_back(i);
}
}
int *father = newint[n + 1]; for (int i = 0; i <= n; i++) father[i] = i; for (int i = 1; i <= 1000; i++) { if (hobbies[i].size() != 0) { int v = getFather(father, hobbies[i][0]); for (int j = 1; j < hobbies[i].size(); j++) { int u = getFather(father, father[hobbies[i][j]]); if (v != u) father[u] = v; } } }
for (int i = 1; i <= n; i++) { father[i] = getFather(father, i); }
int *cluster = newint[n + 1]; fill(cluster, cluster + n + 1, 0); for (int i = 1; i <= n; i++) { cluster[father[i]]++; }
vector<int> ans; for (int i = 1; i <= n; i++) { if (cluster[i] > 0) ans.push_back(cluster[i]); } sort(ans.begin(), ans.end());
printf("%ld\n", ans.size()); for (auto i = ans.rbegin(); i != ans.rend(); i++) { if (i != ans.rbegin()) printf(" "); printf("%d", *i);