0
点赞
收藏
分享

微信扫一扫

7-25 朋友圈(并查集)

IT程序员 2022-03-13 阅读 104
图论算法
  • 题目链接:7-25 朋友圈 (25 分)
  • 考查知识:并查集
  • 题意描述:某学校有N个学生,形成M个俱乐部,一个俱乐部里的学生都是朋友,学生可以参加多个俱乐部,满足“朋友的朋友也是朋友的原则”,找出最大朋友圈里有多少朋友;
  • 思路简析:并查集对一个朋友圈的人进行合并并向父结点更新朋友圈人数,最后遍历所有朋友圈,找最大值即可。
  • 具体代码
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=3e4+100;
    int fa[N],cn[N];//父结点,朋友圈 
    int n,m,k;//n个学生,m个俱乐部,每个俱乐部k个学生 
    void init(){//初始化,编号[1,n]
    	for(int i=1;i<=n;i++){ 
    		fa[i]=i;
    		cn[i]=1;//朋友圈人数初始化为1 
    	}
    }
    int find(int x){//查找根结点(递归写法)
    	if(x==fa[x])return x;
    	else{
    		int f=find(fa[x]);
    		fa[x]=f;
    		return f;
    	}
    } 
    void merge(int a,int b){//如果俩集合根节点不同,合并两集合
    	int faA=find(a);
    	int faB=find(b);
    	if(faA!=faB){
    		fa[faA]=faB;
    		cn[faB]+=cn[faA];//更新朋友圈人数 
    	}
    }
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(0);cout.tie(0);
    	cin>>n>>m;
    	init(); 
    	int a,b;//学生编号 
    	while(m--){
    		cin>>k>>a; 
    		for(int i=0;i<k-1;i++){//一个俱乐部的学生互为朋友,将其合为一个集合 
    			cin>>b;
    			merge(a,b);
    		}
    	} 
    	int mx=0;
    	for(int i=1;i<=n;i++){//遍历朋友圈,找最大朋友圈 
    		mx=max(mx,cn[i]);
    	} 
    	cout<<mx<<endl;
    	return 0;
    }
    
    
举报

相关推荐

0 条评论