拓扑排序
BFS
from collections import deque, defaultdict
def topo_sort_bfs(num_courses, prerequisites):
graph = defaultdict(list)
in_degree = [0] * num_courses
for dest, src in prerequisites:
graph[src].append(dest)
in_degree[dest] += 1
queue = deque()
for i in range(num_courses):
if in_degree[i] == 0:
queue.append(i)
topo_order = []
while queue:
node = queue.popleft()
topo_order.append(node)
for neighbor in graph[node]:
in_degree[neighbor] -= 1
if in_degree[neighbor] == 0:
queue.append(neighbor)
return topo_order if len(topo_order) == num_courses else []
DFS
def topo_sort_dfs(num_courses, prerequisites):
graph = defaultdict(list)
for dest, src in prerequisites:
graph[src].append(dest)
visited = [0] * num_courses
topo_order = []
cycle = False
def dfs(node):
nonlocal cycle
if visited[node] == 1:
cycle = True
return
if visited[node] == 0:
visited[node] = 1
for neighbor in graph[node]:
dfs(neighbor)
visited[node] = 2
topo_order.append(node)
for i in range(num_courses):
if visited[i] == 0:
dfs(i)
if cycle:
return []
return topo_order[::-1]