们可以将深度优先搜索的流程与拓扑排序的求解联系起来,用一个栈来存储所有已经搜索完成的节点。
对于一个节点 uu,如果它的所有相邻节点都已经搜索完成,那么在搜索回溯到 uu 的时候,uu 本身也会变成一个已经搜索完成的节点。这里的「相邻节点」指的是从 uu 出发通过一条有向边可以到达的所有节点。
假设我们当前搜索到了节点 uu,如果它的所有相邻节点都已经搜索完成,那么这些节点都已经在栈中了,此时我们就可以把 uu 入栈。可以发现,如果我们从栈顶往栈底的顺序看,由于 uu 处于栈顶的位置,那么 uu 出现在所有 uu 的相邻节点的前面。因此对于 uu 这个节点而言,它是满足拓扑排序的要求的。
这样以来,我们对图进行一遍深度优先搜索。当每个节点进行回溯的时候,我们把该节点放入栈中。最终从栈顶到栈底的序列就是一种拓扑排序。