并查集

先上题目

题目描述 如题,现在有一个并查集,你需要完成合并和查询操作。
输入格式 第一行包含两个整数N、M,表示共有N个元素和M个操作。
接下来M行,每行包含三个整数Zi、Xi、Yi
当Zi=1时,将Xi与Yi所在的集合合并
当Zi=2时,输出Xi与Yi是否在同一集合内,是的话输出Y;否则话输出N
输出格式 如上,对于每一个Zi=2的操作,都有一行输出,每行包含一个大写字母,为Y或者N

思路

对于并查集总共有两个操作,1.添加联系,2.查询是否具有关系,可以类比成老大找小弟的关系,添加关系既某个人打过了另一个人,他就将另一个人收为小弟,但是,当某个人收了一个小弟后,小弟并不知道他的大哥还有大哥,这显然不合适,难以实现第二项操作,这时便可以引进一维数组f[i],表示第i个人的最大的老大是谁,可以定义一个函数fuc()来求他的最大的老大。

int fuc(int k) {
	if (f[k] == k) return k;
	return f[k] = fuc(f[k]);
}

接下来的两个需要实现的操作
1.添加联系
可令某个人的最大的老大的老大是另一个人的最大的老大相等即:

f[fuc(temp2)] = fuc(temp3);

2.查询是否具有关系

if(fuc(temp2) == fuc(temp3))

下面是完整代码:

#include<iostream>
using namespace std;
int n,m,f[10050];
int fuc(int k) {
 if (f[k] == k) return k;
 return f[k] = fuc(f[k]);
}
int main() {
 cin>>n>>m;
 for (int i=1;i<=n;i++) f[i] = i;
 for (int i=1;i<=m;i++) {
  int temp1,temp2,temp3;
  cin>>temp1>>temp2>>temp3;
  if (temp1 == 1 ) {
   f[fuc(temp2)] = fuc(temp3);
  }else {
   if (fuc(temp2) == fuc(temp3)) {
    cout<<"Y"<<endl;
   }else {
    cout<<"N"<<endl;
   }
  }
 }
 return 0;
}
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值