Python并查集三种

算法 | python | 数据结构 | 模板

2025年1月9日

纯面向过程

def find(lst: list, idx: int):
    if lst[idx] == idx:
        return idx
    lst[idx] = find(lst, lst[idx])
    return lst[idx]


def test(lst: list, a: int, b: int):
    a_leader = find(lst, a)
    b_leader = find(lst, b)
    if a_leader == b_leader:
        return True
    return False


def merge(lst: list, a: int, b: int):
    a_leader = find(lst, a)
    b_leader = find(lst, b)
    if a_leader != b_leader:
        lst[a_leader] = b_leader

lst = [i for i in range(n + 1)]

半oop

class Disjoin:
    def __init__(self):
        self.mapping = dict()

    def find(self, idx: int):
        if idx not in self.mapping:
            self.mapping[idx] = idx

        if self.mapping[idx] == idx:
            return idx

        self.mapping[idx] = self.find(self.mapping[idx])
        return self.mapping[idx]

    def test(self, a: int, b: int):
        a_leader = self.find(a)
        b_leader = self.find(b)
        if a_leader == b_leader:
            return True
        return False

    def merge(self, a: int, b: int):
        a_leader = self.find(a)
        b_leader = self.find(b)
        if a_leader != b_leader:
            self.mapping[a_leader] = b_leader

纯oop

class Disjoin:
    def __init__(self, id_):
        self.id = id_
        self.leader = self

    def find(self):
        if self.leader == self:
            return self
        node = self
        node = node.leader.find()
        self.leader = node
        return node

    def test(self, b: "Disjoin"):
        a_leader = self.find()
        b_leader = b.find()
        if a_leader == b_leader:
            return True
        return False

    def merge(self, b: "Disjoin"):
        a_leader = self.find()
        b_leader = b.find()
        if a_leader != b_leader:
            a_leader.leader = b