拓扑排序(Topological Sorting):一种对有向无环图(DAG)(否则存在环,是从一个点出发回到点,即某些顶点之间的依赖关系形成了一个循环,无法确定它们的先后顺序。
)的所有顶点进行线性排序的方法,使得图中任意一点 u和 v,如果存在有向边 <u,v>,则 u必须在 v 之前出现。对有向图进行拓扑排序产生的线性序列称为满足拓扑次序的序列,简称拓扑排序。结果不止一种。说白了,做题目时可以用来解决一些依赖关系的问题,比如项目的执行顺序,课程的选修顺序等。XX课程必须先选,先执行等等
Kahn实际上是BFS。即先把入度为0的节点删除
def dfs(u):
nonlocal hasCycle#nonlocal 关键字用于在嵌套函数中声明一个在外部函数中定义的变量,
# 作用是允许在内部函数中修改外部函数中定义的变量 hasCycle 的值。
if u in onStack: # 同一次深度优先搜索时,当前顶点被访问过,说明存在环
hasCycle = True
if u in visited or hasCycle: # 当前节点被访问或者有环时直接返回
return
nonlocal可以修改函数外的值,借此复习了一下全局变量和局部变量。