AcWing 836. 合并集合-python
原题链接
简单
作者:
Actor丶
,
2020-02-25 19:08:11
,
所有人可见
,
阅读 884
"""
基本思想:
每个集合用一棵树表示,树根的编号就是集合的编号;每个节点存它的父节点,即p[x]存的是x的父节点
"""
def find(x):
if p[x] != x:
p[x] = find(p[x]) # 路径压缩优化,将多有子节点都指向祖宗节点;!!!注意:这里find函数的参数不能是x,因为这样递归前后函数的参数不变,会陷入死循环
return p[x] # !!!出错:最后要返回的是x的父节点,而不是x
if __name__=="__main__":
n, m = map(int, input().split())
p = [i for i in range(n+1)] # p[x]表示x的父节点,初始化时x的父节点是他自己
while m:
op, a, b = input().split()
a = int(a)
b = int(b)
if op=="M":
p[find(a)] = find(b) # 合并集合:将节点a的祖宗节点的父节点设置为b的祖宗节点
else:
if find(a)==find(b): # 判断是否在一个集合中:节点a的祖宗节点与节点b的祖宗节点相同
print("Yes")
else:
print("No")
m-=1
runtime error了,友友知道为什么么?
python速度好慢