快速处理如下问题:
1、将两个集合合并;
2、询问两个元素是否在一个集合中。
基本原理:
每个集合用一颗树来表示。树根的编号就是整个集合的编号。每个节点存储它父节点,p[x]表示的父节点。
如何判断树根? if(p[x]==x)#父亲等于自身,就是根
如何求集合编号?while(p[x]!=x)x=p[x]
如何合并两个集合:px为x的集合编号,py为y的集合编号,p[x]=y,两个树的根连一下。
会加路径压缩优化
p=[0]*1000010#数组模拟
def find(x):#寻找x节点的祖先,其实就是集合编号。同时加上路径压缩
if p[x]!=x:p[x]=find(p[x])#让节点的父亲都指向祖先
return p[x]
#初始化集合:
for i in range(1,n+1)#下标从1开始 刚开始的时候每个节点自己就是一个集合
p[i]=i
#合并两个点x,y所在的集合:
p[find(x)]=find(y) #x所在节点的祖先的父亲设置为y的祖先,这样y的祖先就是大家的新祖先
#判断两个节点是否在同一集合:
find(x)==find(y)????