0
点赞
收藏
分享

微信扫一扫

L3-003 社交集群

茗越 2022-03-13 阅读 34
  • 题目链接:L3-003 社交集群
  • 考查知识:并查集+sort排序
  • 题意描述:n个人有k个爱好,问不同的社交集群的个数与每个集群中的人数。
  • 思路简析:对爱好做并查集,区分了爱好类;再遍历所有人,记录每个人所属的爱好类的根结点,并标记该爱好类的人数+1
  • 具体代码
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e3+10; 
    int fa[N],a[N],b[N];//a[i]为第i个人的其中一个爱好,b[i]为以i为根的集合包含的人数 
    void init(int n){
    	for(int i=1;i<=N;i++)//[1,N] 
    		fa[i]=i;
    } 
    int find(int x){
    	if(x==fa[x])return x;
    	else return fa[x]=find(fa[x]);
    }
    void merge(int a,int b){
    	int faA=find(a),faB=find(b);
    	if(faA!=faB)fa[faA]=faB;
    }
    int main(){
    	int n;
    	cin>>n;
    	init(n);
    	for(int i=1;i<=n;i++){//n个人 
    		int k,s;
    		char t;
    		cin>>k>>t>>a[i];//k个爱好 
    		for(int j=0;j<k-1;j++){
    			cin>>s;
    			merge(a[i],s);//对爱好做并查集 
    		} 
    	}
    	for(int i=1;i<=n;i++){//遍历所有人,找根 
    		b[find(a[i])]++; 
    	} 
    	int cn=0;//不同的社交集群的个数
    	for(int i=1;i<=1000;i++){
    		if(b[i])cn++;
    	}
    	sort(b,b+1001,greater<int>());//排序后输出 
    	cout<<cn<<endl;
    	for(int i=0;i<cn;i++){
    		if(i)cout<<" ";
    		cout<<b[i];
    	}
    	return 0;
    }
    
    
举报

相关推荐

0 条评论