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
- 字典序的拓扑排序