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<iostream>
#include<cstdio>
#include<algorithm>
const int maxn = 1005;
using namespace std;
int p[maxn],bk[maxn],c[maxn],n;
bool cmp(int a,int b){
return a>b;
}
int findf(int k){
int a=k;
while(k!=p[k]) k=p[k];
// while(a!=p[a]){
// int z=a;
// a=p[a];
// p[z] = k;
// }
return k;
}
void Union(int a,int b){
int fa=findf(a);
int fb=findf(b);
if(fa!=fb) p[fa] = fb;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) p[i] = i;
int k,x;
for(int i=1;i<=n;i++){
scanf("%d: ",&k);
for(int j=0;j<k;j++){
cin>>x;
if(!c[x]) c[x] = i;
Union(i,c[x]);
}
}
for(int i=1;i<=n;i++){
bk[findf(i)]++;
}
int cnt=0;
for(int i=1;i<=n;i++){
if(bk[i]) cnt++;
}
sort(bk+1,bk+n+1,cmp);
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++){
if(i<cnt) cout<<bk[i]<<' ';
else cout<<bk[i];
}
return 0;
}