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
并查集问题。
#include<vector> #include<iostream> #include<algorithm> using namespace std; typedef struct node { bool f; int root; vector<int>c; }; int p[1001]; node h[1001]; int findr(int num) { if(h[num].root==num) return num; int r=findr(h[num].root); h[num].root=r; return r; } int main() { int n; cin>>n; int ord[1001]; for(int i=0;i<=1000;i++) { h[i].root=i; h[i].f=false; ord[i]=0; } for(int i=1;i<=n;i++) { int ph; scanf("%d:",&ph); int hid=0; for(int j=0;j<ph;j++) { cin>>hid; h[hid].f=true; h[hid].c.push_back(i); } p[i]=hid; } for(int i=1;i<=1000;i++) { if(h[i].f) { int r1=findr(h[i].root); for(int j=0;j<h[i].c.size();j++) { int r2=findr(p[h[i].c[j]]); if(r1!=r2) { h[r2].root=r1; } } } } for(int i=1;i<=n;i++) { p[i]=findr(p[i]); ord[p[i]]++; } int cnt=0; for(int i=1;i<=1000;i++) if(h[i].f&&h[i].root==i) cnt++; cout<<cnt<<endl; sort(ord,ord+1001); cout<<ord[1000]; for(int i=999;i>=0;i--) { if(ord[i]==0) break; cout<<" "<<ord[i]; } cout<<endl; return 0; }