栈实现
- 入度为 0 的顶点入栈
- 每轮栈顶弹出并输出,检测弹出导致入读为 0 的顶点,压入
- 直到栈空,排序完成
时间复杂度
- 邻接表 $O(\lvert V \rvert+\lvert E \rvert)$
- 邻接矩阵 $O(\lvert V \rvert^{2})$
DFS 实现
DFS 基本等价于栈,爆栈风险比用堆的 std::stack 大
队列实现
因为实际上拓扑排序都是尾递归,所以也可以用队列实现
坑点
- 拓扑排序唯一 $\nRightarrow$ 图可以确定 e.g. 下面两张图都满足拓扑排序唯一为 1 2 3
graph LR
1 ---> 2
2 ---> 3
graph LR
1 ---> 2
2 ---> 3
1 ---> 3
- 拓扑排序方案数是 NP 问题 中的 P-完全问题,老老实实枚举吧
- 拓扑排序实现是尾递归,即可以用栈也可以队列