【课程表】

566 篇文章

已下架不支持订阅

153 篇文章

已下架不支持订阅

141 篇文章

已下架不支持订阅

题目来源

207. 课程表 - 力扣(LeetCode)

我们可以根据题目要求画出一个有向图,比如下面用例

numCourses = 4, prerequisites = [[2,1], [4,3], [4,2]]

学2之前,必须先学1;

学4之前,必须先学2,3

学1,3没有前置课程。

因此,通过上面有向图,我们可以得出,能够学完所有课程。

而上面有向图其实就是一种拓扑结构,在拓扑结构中,每一个顶点都有“入度”概念,所谓入度,即当前顶点的直接前驱顶点数目

如上图所示,

顶点1的入度为0

顶点2的入度为1

顶点3的入度为0

顶点4的入度为2,注意入度指的是当前顶点的直接前驱顶

已下架不支持订阅

### 拓扑排序的概念 拓扑排序是一种针对有向无环图(Directed Acyclic Graph, DAG)的操作,其目标是将图中的所有顶点排列成一个线性序列,使得如果存在一条从顶点 \( u \) 到顶点 \( v \) 的边,则在该线性序列中,\( u \) 出现在 \( v \) 之前[^1]。这种排序方式广泛应用于任务调度、项目管理等领域,尤其是在处理具有依赖关系的任务时非常有用。 --- ### 拓扑排序的实现方法 #### 方法一:Kahn算法 Kahn算法的核心思想是从图中移除入度为零的节点,并更新剩余节点的入度,直到所有的节点都被移除为止。具体步骤如下: 1. 统计每个节点的入度。 2. 将所有入度为零的节点加入队列或栈。 3. 当队列/栈非空时: - 取出队首/栈顶的一个节点并将其放入结果列表。 - 对于该节点的所有邻居节点,减少它们的入度;如果某个邻居节点的入度变为零,则将其加入队列/栈。 4. 如果最终的结果列表长度等于原图的节点数,则成功完成拓扑排序;否则说明图中有环,无法进行拓扑排序。 以下是Python实现代码: ```python from collections import deque, defaultdict def topological_sort_kahn(graph): indegree = {node: 0 for node in graph} # 初始化入度字典 for neighbors in graph.values(): for neighbor in neighbors: indegree[neighbor] += 1 queue = deque([node for node in indegree if indegree[node] == 0]) # 所有入度为0的节点入队 result = [] while queue: current_node = queue.popleft() result.append(current_node) for neighbor in graph[current_node]: indegree[neighbor] -= 1 if indegree[neighbor] == 0: queue.append(neighbor) if len(result) != len(indegree): # 存在环的情况 raise ValueError("Graph has a cycle; no valid topological order exists.") return result ``` 此算法的时间复杂度为 \( O(V + E) \)[^2],其中 \( V \) 是节点数量,\( E \) 是边的数量。 --- #### 方法二:基于深度优先搜索(DFS) 另一种常见的拓扑排序方法是利用深度优先搜索(DFS)。通过记录每个节点的访问结束时间,可以得到逆序的拓扑排序结果。具体步骤如下: 1. 遍历图中的所有未访问过的节点,对其执行DFS。 2. 在DFS返回时,将当前节点压入堆栈。 3. 堆栈顶部存储的就是拓扑排序的结果。 以下是Python实现代码: ```python def dfs_topological_sort(graph): visited = set() # 记录已访问的节点 stack = [] # 结果堆栈 def dfs(node): if node not in visited: visited.add(node) for neighbor in graph.get(node, []): dfs(neighbor) stack.append(node) for node in graph: if node not in visited: dfs(node) return stack[::-1] # 返回反转后的堆栈作为拓扑排序结果 ``` 这种方法同样适用于有向无环图,且时间复杂度也为 \( O(V + E) \)[^4]。 --- ### 总结 两种主要的拓扑排序方法各有优劣。Kahn算法更直观,适合用于检测是否有环的存在;而基于DFS的方法则更适合需要递归遍历的应用场景。无论哪种方法,都需确保输入图为有向无环图才能获得有效的拓扑排序结果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员阿甘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值