并查集,合并和查询
其中进行路径压缩原理可以参考:https://blog.csdn.net/zjy_code/article/details/80634149
用途:
1、一个相互连接,查看主要有几个不相交集合
2、判断图中是否有环,原理是如果两个之前已经在同一个集合里面的两个节点再次要合并,也就是说原来就连通的两点间要再次连接,说明有环。
father = []
n = len(M)
for i in range(n):
father.append(i)
#递归获得最高级父节点,并把该路径上所有父节点都指向根节点
def get(x):
if father[x] == x:
return x
#路径压缩,直接父节点全连到根节点上,降低以后查找的复杂度到O(1)
father[x] = get(father[x])
return father[x]
#把两个节点的根节点连到一起,也就把两个集合合到一起
def union(x,y):
xx = get(x)
yy = get(y)
#这里可以用于用途2判断有环
if xx!=yy:
father[xx] = father[yy]