P3367 【模板】并查集 题解

看原题左转哈!

 

https://www.luogu.com.cn/problem/P3367

先定变量

int n,m,f[11451];
int fx=find(x),fy=find(y);//find函数后面说
int temp,x,y;

 由题可知,要输入nm为先

cin>>n>>m;

然后,就是并查集中的基本初始化,将自己定义为自己的父亲结点

for(int i=1;i<=n;i++){
	f[i]=i;
}

这时,该输入Z_{i}X_{i}Y_{i}(其实就是前面定义变量中的temp,x,y)

for(int i=1;i<=m;i++){
	cin>>temp>>x>>y;

} 

之后,进行判断Z_{i}为1还是为2,以及判断关系输出

for(int i=1;i<=m;i++){
	cin>>temp>>x>>y;
	if(temp==1){
		merge(x,y);
	}else{
		if(find(x)==find(y)){
			cout<<"Y"<<endl;
		}else{
			cout<<"N"<<endl;
		}
	}
} 

好,现在正式步入正题

find函数(用来查询祖先的,看最上层的结点是哪个)

int find(int x){
	if(f[x]==x){
		return x;
	}
	return find(f[x]); 
}//查询祖先 

then

merge函数(将有关系的结点合并在一起)

void merge(int x,int y){
	int fx=find(x),fy=find(y);
	if(fx!=fy){
		f[fx]=fy;
	}
}//合并祖先 

最终,组合代码

#include<iostream>
using namespace std;
int n,m,f[10001];
int temp,x,y;//指令,判断是1是2 
int find(int x){
	if(f[x]==x){
		return x;
	}
	return find(f[x]); 
}//查询祖先 
void merge(int x,int y){
	int fx=find(x),fy=find(y);
	if(fx!=fy){
		f[fx]=fy;
	}
}//合并祖先 
int main(){
	
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		f[i]=i;
	}
	for(int i=1;i<=m;i++){
		cin>>temp>>x>>y;
		if(temp==1){
			merge(x,y);
		}else{
			if(find(x)==find(y)){
				cout<<"Y"<<endl;
			}else{
				cout<<"N"<<endl;
			}
		}
	} 
	
	return 0;
}

好,测试!

额。。。。。。。。

那就优化一下!

int find(int x){
	if(f[x]==x){
		return x;
	}
	return f[x]=find(f[x]); //原本为return find(f[x]); 
}//查询祖先 

again?

 

 

诶嘿,开溜 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值