一、题目
二、解析
1、并查集是什么:
合并两个集合,将一个集合所在的树作为另一个集合的子树。也就是将根节点进行合并,保证树的结构
2、实现细节:
2.1、对于每个节点,记录s[x]表示x的根节点,初始化根节点为自己
2.2、合并集合x,y,找到点x的根节点rootx,点y的根节点rooty,设置s[rootx] = rooty
2.3、查询集合x,y,只需要判断rootx是否等于rooty
三、过程理解 (从别人那里ctrl+c,ctrl+v过来的)
四、代码
import os
import sys
input = sys.stdin.readline # 可以加快运行速度
# 定义寻找x的根节点的函数
def findroot(x):
if x!=s[x]: # 如果x不是根节点
s[x] = findroot(s[x]) # 不断递归,直到找到根节点
return s[x] # 输出根节点
# 定义合并函数,让x,y绑定起来,他们的根节点是同一个
def merge(x,y):
rootx = findroot(x)
rooty = findroot(y)
if rootx != rooty: # x,y 的根节点不同
s[rootx] = rooty # x的根节点的根节点是y的根节点,使得x,y的根节点是同一个
# 定义查询函数,查询x,y的根节点是否一样
def query(x,y):
if findroot(x) == findroot(y):
return True
else:
return False
n,m = map(int,input().split())
s = list(range(n+1)) #表示x的根节点是s[x]
for _ in range(m):
op,x,y = map(int,input().split())
if op == 1:
merge(x,y)
else:
if query(x,y):
print("YES")
else:
print("NO")