并查集与拓扑排序 (Union Find & Topological Sort)
并查集与拓扑排序
并查集用于处理集合的合并与查询,常用于连通分量、冗余连接等问题。拓扑排序用于有向无环图(DAG)的排序,常用于任务调度、课程安排等。
典型例题
1. 冗余连接(并查集)
def findRedundantConnection(edges):
parent = list(range(len(edges)+1))
def find(x):
while parent[x] != x:
parent[x] = parent[parent[x]]
x = parent[x]
return x
for u, v in edges:
pu, pv = find(u), find(v)
if pu == pv:
return [u, v]
parent[pu] = pv
print(findRedundantConnection([[1,2],[1,3],[2,3]])) # 输出: [2,3]
2. 课程表(拓扑排序)
from collections import deque
def canFinish(numCourses, prerequisites):
indegree = [0]*numCourses
graph = [[] for _ in range(numCourses)]
for a, b in prerequisites:
graph[b].append(a)
indegree[a] += 1
queue = deque([i for i in range(numCourses) if indegree[i]==0])
count = 0
while queue:
node = queue.popleft()
count += 1
for nei in graph[node]:
indegree[nei] -= 1
if indegree[nei] == 0:
queue.append(nei)
return count == numCourses
print(canFinish(2, [[1,0]])) # 输出: True