0
点赞
收藏
分享

微信扫一扫

并查集入门(C++)

金牛豆豆 2022-04-07 阅读 38

并查集入门

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;
#define MAXN 20001
int fa[MAXN];
void init(int n){
	for(int i=1;i<=n;i++)
		fa[i]=i;//先初始化将所有节点的父节点设为自身 
}
int find(int x){
	if(x==fa[x])
		return x;
	else{
		fa[x]=find(fa[x]);//父节点设为根节点 
		return fa[x];//返回父节点 
	}
}
void unionn(int i,int j){
	int i_fa = find(i);//找到i的祖先 
	int j_fa = find(j);//找到j的祖先 
	fa[i_fa] = j_fa; //i的祖先指向j的祖先,其实j的祖先指向i的祖先 
}
int main(){
	int n,m,x,y,q;
	scanf("%d",&n);
	init(n);
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d%d",&x,&y);
		unionn(x,y);
	} 
	scanf("%d",&q);
	for(int i=1;i<=q;i++){
		scanf("%d%d",&x,&y);
		if(find(x) == find(y))
			printf("YES\n");
		else 
			printf("NO\n");
	}
	return 0;
} 
举报

相关推荐

0 条评论