P3367 【模板】并查集

P3367 【模板】并查集

#include<iostream>
#include<algorithm>
using namespace std;
const int maxm=10010;
int pre[maxm];
int n,m;
void make()//初始化
{
	for (int i=1;i<=n;i++)
	{
		pre[i]=i;
	}
}
int find(int x)//查询,并进行路径压缩
{
	int r=x;
	while (pre[r]!=r)
	{
		r=pre[r];
	}
	int i=x,j;
	while (i!=r)
	{
		j=pre[i];
		pre[i]=r;
		i=j;
	}
	return r;
}
void Union(int x,int y)//合并
{
	int fx=find(x);
	int fy=find(y);
	if (fx==fy) 
	   return ;
	else
	{
		pre[fx]=fy;
	}
}
int main()
{
	cin>>n>>m;
	make();
	for (int i=1;i<=m;i++)
	{
		int r,x,y;
		cin>>r>>x>>y;
		if (r==1)
		{
			Union(x,y);
		}
		else if(r==2)
		{
			if (find(x)==find(y))
			{
				cout<<"Y"<<endl;
			}
			else
			{
				cout<<"N"<<endl;
			}
		}
	}
}
/*
输入 
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
输出
N
Y
N
Y
*/
 

  

posted @ 2022-03-06 18:08  心悟&&星际  阅读(28)  评论(0编辑  收藏  举报