AcWing 836. 合并集合
原题链接
简单
作者:
头号玩家
,
2024-10-15 10:23:12
,
所有人可见
,
阅读 1
n,m=map(int,input().split())
p=list(range(n+1))
##python只能递归1000次,否则爆栈?
# def find(x):#查找祖宗节点并返回该节点+路径压缩
# global p
# if p[x]!=x:
# p[x]=find(p[x])#此处原始x路径上的所有节点的父节点都改为祖宗节点
# return p[x]
# def find(x):
# # 首先创建一个备份节点t,将一开始的x存下来,为了以后将这一路的父节点全部更新
# t = x
# # x循环找根节点
# while p[x] != x:
# x = p[x]
# # 找到根节点后利用备份节点将这一路上的节点全部变为根节点的儿子
# while t != x:
# # 创建备份节点的影分身,将分身的父节点更新
# p[t] = x
# # 本体继续向上走
# t = p[t]
# return p[x]
def find(x):
t=x
while p[x]!=x:
x=p[x]#退出循环时已经找到祖宗节点了并赋给x
while t!=x:
a=p[t]
p[t]=x
t=a
return x
for _ in range(m):
ins=list(input().split())
a=int(ins[1])
b=int(ins[2])
if ins[0]=='M':
p[find(a)]=find(b)
else:
if find(a)==find(b):
print("Yes")
else:
print("No")