跳转至

08 - 并查集与拓扑排序

1. 并查集( Disjoint Set Union )

用途:动态维护连通块。

关键优化: - 路径压缩 - 按秩/按大小合并

Python
class DSU:
    def __init__(self, n):
        self.fa = list(range(n))
        self.sz = [1] * n

    def find(self, x):
        while self.fa[x] != x:
            self.fa[x] = self.fa[self.fa[x]]
            x = self.fa[x]
        return x

    def union(self, a, b):
        ra, rb = self.find(a), self.find(b)
        if ra == rb:
            return False
        if self.sz[ra] < self.sz[rb]:
            ra, rb = rb, ra
        self.fa[rb] = ra
        self.sz[ra] += self.sz[rb]
        return True

2. 拓扑排序( DAG )

Python
from collections import deque

def topo_sort(n, edges):
    g = [[] for _ in range(n)]
    indeg = [0] * n
    for u, v in edges:
        g[u].append(v)
        indeg[v] += 1
    q = deque([i for i in range(n) if indeg[i] == 0])
    order = []
    while q:
        u = q.popleft()
        order.append(u)
        for v in g[u]:
            indeg[v] -= 1
            if indeg[v] == 0:
                q.append(v)
    return order if len(order) == n else []

3. 复杂度要求

  • 并查集:均摊近似 O(1)(反 Ackermann )
  • 拓扑排序:O(n + m)

4. 训练清单

  • 冗余连接
  • 省份数量
  • 课程表 I/II
  • 字典序的拓扑排序