并查集(合并、查询)模板

合并和查询操作:
第一行包含两个整数N、M,表示共有N个元素和M个操作。

接下来M行,每行包含三个整数Zi、Xi、Yi

当Zi=1时,将Xi与Yi所在的集合合并

当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输出N

输出格式:
如上,对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N

输入样例#1:
4 7
2 1 2
1 1 2
2 1 2
1 3 4
2 1 4
1 2 3
2 1 4
输出样例#1:
N
Y
N
Y

详情请咨询

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#define maxn 300005
#define ll long long 

using namespace std;

ll f[maxn];			//存放各点祖宗节点的数组;

ll find(ll x)		//查找老大是谁;
{
	if(f[x]==x)		
	  return x;
	else	 
	 return  f[x]=find(f[x]);		//这里是路径压缩,把递归过程中遇到的结点的祖宗结点也直接修改了
	 								//也就是使途中经过的人的大哥也变成老大。
                                    
	
	
}


int main()
{
	ll i,j,n,m,k,s,x,y;
	
	scanf("%lld %lld",&n,&m);
	
	for(i=1;i<=n;i++)
	  f[i]=i;				//初始化,定义每个点的老大都是它自身;
	  
	for(i=1;i<=m;i++)		
	 {
	 	 scanf("%lld %lld %lld",&s,&x,&y);
	 	 
	 	 if(s==1)
	 	   f[find(x)]=find(y);		//y打赢了x,所以y的老大就是x的老大了;
	 	 else
	 	    {
	 	    	if(find(x)==find(y))		//判断x和y的老大是不是同一个人;
	 	    	  printf("Y\n");
	 	    	else
	 	    	  printf("N\n");
	 	    	
			 }
	 		 	 
	 }
		
	return 0;
 } 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值