数据结构与算法之 leetcode 图论拓扑排序 有向无环图

数据结构与算法阿木 发布于 2025-07-12 7 次阅读


图论拓扑排序:有向无环图中的关键算法

拓扑排序(Topological Sorting)是一种对于有向无环图(DAG)的线性化方法,它将顶点排序成一个线性序列,使得对于图中任意有向边(u, v),都有u在v之前。拓扑排序在计算机科学中有着广泛的应用,如课程安排、项目调度、依赖关系管理等。

本文将围绕拓扑排序这一主题,从基本概念、算法实现、应用场景等方面进行深入探讨。

基本概念

有向无环图(DAG)

有向无环图(Directed Acyclic Graph,DAG)是一种特殊的图,其中每个顶点都有入边,且不存在任何环。DAG可以表示一系列的依赖关系,例如课程之间的先修关系。

拓扑排序

拓扑排序的目标是将DAG中的顶点排序成一个线性序列,满足以下条件:

1. 对于任意有向边(u, v),都有u在v之前。

2. 每个顶点只出现一次。

算法实现

拓扑排序的算法有多种,以下是两种常见的实现方法:

1. 深度优先搜索(DFS)

深度优先搜索(Depth-First Search,DFS)是一种用于遍历或搜索树或图的算法。以下是使用DFS实现拓扑排序的步骤:

1. 初始化一个栈和一个布尔数组,分别用于存储顶点和访问状态。

2. 遍历所有顶点,对于每个未访问的顶点,执行DFS。

3. 在DFS过程中,将访问过的顶点压入栈中。

4. 遍历完成后,栈中的顶点序列即为拓扑排序结果。

python

def dfs_topological_sort(graph):


visited = [False] len(graph)


stack = []

def dfs(node):


visited[node] = True


for neighbor in graph[node]:


if not visited[neighbor]:


dfs(neighbor)


stack.append(node)

for i in range(len(graph)):


if not visited[i]:


dfs(i)

return stack[::-1]

示例


graph = [[1, 2], [3], [3], []]


print(dfs_topological_sort(graph)) 输出:[0, 1, 2, 3]


2. Kahn算法

Kahn算法是一种基于入度(in-degree)的拓扑排序算法。以下是Kahn算法的步骤:

1. 计算所有顶点的入度,并将入度为0的顶点加入队列。

2. 遍历队列,对于每个顶点,将其从图中删除,并将相邻顶点的入度减1。

3. 如果相邻顶点的入度变为0,将其加入队列。

4. 重复步骤2和3,直到队列为空。

python

from collections import deque

def kahn_topological_sort(graph):


in_degree = [0] len(graph)


for node in range(len(graph)):


for neighbor in graph[node]:


in_degree[neighbor] += 1

queue = deque([i for i in range(len(graph)) if in_degree[i] == 0])


topological_order = []

while queue:


node = queue.popleft()


topological_order.append(node)


for neighbor in graph[node]:


in_degree[neighbor] -= 1


if in_degree[neighbor] == 0:


queue.append(neighbor)

return topological_order

示例


graph = [[1, 2], [3], [3], []]


print(kahn_topological_sort(graph)) 输出:[0, 1, 2, 3]


应用场景

拓扑排序在计算机科学中有着广泛的应用,以下是一些常见的应用场景:

1. 课程安排:在大学中,某些课程可能需要先修其他课程。拓扑排序可以帮助确定课程的先后顺序,确保学生能够按照正确的顺序学习。

2. 项目调度:在项目管理中,某些任务可能依赖于其他任务。拓扑排序可以帮助确定任务的执行顺序,确保项目能够按时完成。

3. 依赖关系管理:在软件开发中,某些模块可能依赖于其他模块。拓扑排序可以帮助确定模块的依赖关系,确保代码的编译和运行。

4. 数据流分析:在数据流分析中,拓扑排序可以帮助确定数据流的顺序,确保数据能够按照正确的顺序进行处理。

总结

拓扑排序是一种重要的图论算法,在计算机科学中有着广泛的应用。本文介绍了拓扑排序的基本概念、算法实现和应用场景,并通过Python代码展示了两种常见的拓扑排序算法。希望本文能够帮助读者更好地理解拓扑排序,并将其应用于实际问题中。