天梯L3-003. 社交集群——并查集
在社交网络平台注册时,用户通常会输入自己的兴趣爱好,以便找到和自己兴趣相投的朋友。有部分兴趣相同的人们就形成了“社交集群”。现请你编写程序,找出所有的集群。
输入格式:
输入的第一行给出正整数N(<=1000),即社交网络中的用户总数(则用户从1到N编号)。随后N行,每行按下列格式列出每个人的兴趣爱好:
Ki: hi[1] hi[2] ... hi[Ki]
其中Ki(>0)是第i个人的兴趣的数量,hi[j]是第i个人的第j项兴趣的编号,编号范围为[1, 1000]内的整数。
输出格式:
首先在第一行输出整个网络中集群的数量,然后在第二行按非递增的顺序输出每个集群中用户的数量。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
8 3: 2 7 10 1: 4 2: 5 3 1: 4 1: 3 1: 4 4: 6 8 1 5 1: 4
输出样例:
3 4 3 1
/*判断两个数据是不是属于同一集合,用数据的最高父结点来标记这个数据,两个数据的父结点相同就属于同一集合。
*/
1 #include <iostream> 2 #include <math.h> 3 #include <algorithm> 4 #include <stdio.h> 5 using namespace std; 6 int c[1005],f[1005]; 7 int find(int x) 8 { 9 return x==f[x]?x:f[x]=find(f[x]); 10 } 11 void merge(int x,int y) 12 { 13 x=find(x),y=find(y); 14 if(x!=y) f[x]=y; 15 } 16 bool cmp(int x,int y) 17 { 18 return x>y; 19 } 20 int main() 21 { 22 //freopen("in.txt","r",stdin); 23 int n,k,tt,v; 24 cin>>n; 25 for(int i=0;i<1005;i++) f[i]=i; 26 for(int i=0;i<n;i++) 27 { 28 scanf("%d: ",&k); 29 scanf("%d",&tt); 30 c[i]=tt; 31 for(int i=1;i<k;i++) 32 { 33 cin>>v; 34 merge(tt,v); 35 } 36 } 37 //for(int i=0;i<n;i++) cout<<c[i]<<" "; 38 int num[1005]={0},cnt=0; 39 for(int i=0;i<n;i++) 40 num[find(c[i])]++; 41 sort(num,num+1005,cmp); 42 for(int i=0;i<1005;i++) 43 if(num[i]!=0) cnt++; 44 cout<<cnt<<endl; 45 for(int i=0;i<cnt;i++) 46 { 47 if(i==0) cout<<num[i]; 48 else cout<<" "<<num[i]; 49 } 50 cout<<endl; 51 }