合并两个集合:将一个集合作为另一个集合的子树 如:Merge(b,f)表示将f所在的集合作为b所在集合的子树,注意是根节点进行合并才能保证树结构,即让b的根节点a变为f的根节点c的父节点
判断两个集合是否属于同一个集合:判断根节点是否相同
实现代码思路细节:
p[x]表示x的父节点
1.初始化p[x]为x即初始化x为根节点(根节点的父节点为自己)
2.合并集合x,y。找到x的根节点rootx的根节点和rooty的根节点使p[rootx]=rooty把y的根节点变为x的根节点的父节点即完成集合合并
3.查询节点x,y是否为一个集合即查询x与y的根节点是否相同。
4.查找根节点使进行路径压缩使得一个集合的每个子节点都指向祖宗节点(根节点),这样查询根节点时就可以大大降低了时间复杂度。将链式查询变为了树状查询。
import os
import sys
input=sys.stdin.readline
# 请在此输入您的代码
##查找该节点的根节点
##对于根节点p[x]=x
def findroot(x):
##p[x]表示x节点的父节点
##如果是该节点与父节点相同那么为根节点则返回(递归出口)
if x==p[x]:
return x
##如果不相同说明该节点不是根节点则把该节点的父节点变为根节点(祖宗节点)
##路径压缩
p[x]=findroot(p[x])
return p[x]
##合并a,b
def merge(a,b):
##合并a,b两个节点直接将一个节点的根结点变为另一个节点的根节点的父节点
rootx=findroot(x)
rooty=findroot(y)
p[rootx]=rooty
##把rootx的父节点变为rooty
##判断a,b是否属于同一个集合
def query(a,b):
##两个节点的祖宗相同则为同一个集合
##不同则不是同一个集合
return findroot(a)==findroot(b)
n,m=map(int,input().split())
##初始化所有节点全为根节点
p=[i for i in range (n+1)]