并查集 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)