#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author : guangxu.qi
# @Time : 2020/11/6 15:40
# @FileName: UnionFind.py
# @Description:
class UnionFind(object):
def __init__(self, n):
# 根节点个数
self.root_num = n
self.parent = list(range(n))
# 树的重量
self.size = [1 for i in range(n)]
def get_root(self, i):
# while i != self.parent[i]:
# # 路径压缩
# self.parent[i] = self.parent[self.parent[i]]
# i = self.parent[i]
if i != self.parent[i]:
self.parent[i] = self.get_root(self.parent[i])
return self.parent[i]
def union(self, i, j):
i_root = self.get_root(i)
j_root = self.get_root(j)
if i_root == j_root:
return
# 平衡树的结构,小树接到大树下面
if self.size[i_root] > self.size[j_root]:
self.parent[j_root] = i_root
self.size[i_root] += self.size[j_root]
else:
self.parent[i_root] = j_root
self.size[j_root] += i_root
self.root_num -= 1
def is_connected(self, i, j):
return self.get_root(i) == self.get_root(j)
def count(self):
return self.root_num
if __name__ == '__main__':
M = [[1, 0, 0, 1], [0, 1, 1, 0], [0, 1, 1, 1], [1, 0, 1, 1]]
n = len(M)
uf = UnionFind(n)
for i in range(n):
for j in range(n):
if M[i][j] == 1 and i != j:
uf.union(i, j)
print(uf.count())
并查集 (Union Find)
最新推荐文章于 2024-09-29 14:13:49 发布