1. 并查集
并查集可谓非常有用了, 比如用于判断两个节点是否连通, 计算图的连通分量个数, 甚至有一些巧妙的操作"逆向"的解决问题, 比如leetcode803:打砖块
以下是Python代码实现
class UnionFind:
def __init__(self, n):
"""
:n: 并查集节点总数
"""
self.__parent = [i for i in range(n)]
self.__size = [1]*n
self.__num_sets = n
def find(self, index):
r"""查找节点index的根节点并返回
"""
if self.__parent[index] != index:
self.__parent[index] = self.find(self.__parent[index])
return self.__parent[index]
def merge(self, index0, index1):
r"""合并两个节点, 即将index0的父节点parent0的父节点置位index1的父节点parent1
"""
parent0 = self.find(index0)
parent1 = self.find(index1)
if parent0 != parent1:
self.__parent[parent0] = parent1
self.__size[parent1] += self.__size[parent0]
self.__num_sets -= 1
def get_size(self, index):
r"""返回以index为根节点的集合的大小
"""
root = self.find(index)
return self.__size[root]
def is_connected(self, index0, index1):
r"""如果index0和index1同属一个集合, 返回true, 否则false
"""
return self.find(index0) == self.find(index1)