并查集 python实现

1、原理(点击查看)

2、完整代码及实例

  (数组parent记录了每个点的前导点是什么,函数findroot是查找,unionTree是合并)

  实例:给定一个N*N的矩阵M,代表某软件上所有用户的互动,如果M[i][j]==1,那么第i个和第j个用户互动过,为0的话代表没有互动。其中,同一个用户,互动次数我们计为0。请你计算并输出发现的互动群体的个数。

def findroot(x):
    x_root = x
    while -1 != parent[x_root]:
        x_root = parent[x_root]

    #路径压缩
    while x_root != x:
        tem = parent[x]
        parent[x] = x_root
        x = tem

    return x_root


def unionTree(x,y):
    x_parent = findroot(x)
    y_parent = findroot(y)

    if x_parent != y_parent:
        parent[x_parent] = y_parent
        return True
    return False

if __name__ == '__main__':
    n = 3
    parent = [-1]*n
    data = [
            [0,1,0],
            [1,0,0],
            [0,0,0]
    ]
    for i in range(len(parent)):
        for j in range(i,len(parent)):
            if data[i][j]>=1:
                if unionTree(i,j):
                    n -=1
    print(n)

 

posted @ 2020-05-09 16:46  r1-12king  阅读(223)  评论(0编辑  收藏  举报