拓扑排序是一种用于有向无环图(DAG, Directed Acyclic Graph)的重要操作,它可以对图中的结点进行排序,使得对于每一条有向边 (u, v),顶点 u 在排序中都出现在顶点 v 之前。本文介绍一种通过重复寻找入度为0的结点,并删除该结点及其发出的边来实现拓扑排序的方法,并分析其时间复杂度。同时,也将讨论如果图中包含环路将会发生什么情况。
算法思想
-
初始化:
- 计算每个结点的入度。
- 将所有入度为0的结点加入一个队列。
-
排序过程:
- 当队列不为空时,执行以下步骤:
- 从队列中取出一个入度为0的结点,将其加入拓扑排序结果中。
- 对该结点的每一个邻接结点,将其入度减1。
- 如果某个邻接结点的入度减为0,则将其加入队列。
- 如果队列为空,但拓扑排序结果中的结点少于图中的结点总数,则说明图中存在环路。
- 当队列不为空时,执行以下步骤: