0
点赞
收藏
分享

微信扫一扫

L2-024 部落(并查集)

史值拥 2022-03-14 阅读 77
  • 题目链接:L2-024 部落
  • 考查知识:并查集
  • 题意描述:纯纯并查集
  • 具体代码
    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    const int N=1e5+10; 
    int fa[N]; 
    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,k,t,t1,q;
    	cin>>n;
    	init(n); 
    	set<int>s,s2;
    	while(n--){
    		cin>>k>>t;
    		for(int i=0;i<k-1;i++){
    			cin>>t1;
    			merge(t,t1);
    			s.insert(t1);//保存所有编号 
    		}
    		s.insert(t);//保存所有编号  
    	}
    	for(auto it=s.begin();it!=s.end();it++){
    		s2.insert(find(*it));//s2保存并查集根节点,即互不相交的部落 
    	}
    	cout<<s.size()<<' '<<s2.size()<<endl;//这个社区的总人数、以及互不相交的部落的个数
    	cin>>q;
    	while(q--){
    		cin>>t>>t1;
    		if(find(t)==find(t1))cout<<"Y"<<endl;
    		else cout<<"N"<<endl;
    	} 
    	return 0;
    }
    
    
举报

相关推荐

0 条评论