我一直在研究SCC及其相关算法,发现人们几乎总是提到 Kosaraju 算法不仅可以找到 SCC,而且还能以(反向)拓扑排序的方式返回它们。
我的问题是:Tarjan 算法难道也不能以(反向)拓扑排序的方式返回结果吗?我从阅读的资料中发现它没有被提到(至少除了维基百科外)。
我一直在思考这个问题,觉得很有道理。当 tarjans_dfs 在某个节点 u 上调用时,所有从 u 可达的 SCC 都将在 u 的 SCC 之前找到。我错了吗?
维基百科说它实际上确实能够找到:
“虽然每个强连通分量内节点的顺序并没有什么特别之处,但该算法的一个有用性质是,在任何一个后继被发现之前,该算法都不会识别出任何强连通分量。因此,被识别的强连通分量的顺序构成了由这些强连通分量组成的 DAG 的逆拓扑排序。”
是我想多了,还是大家更知道 Kosaraju 算法可以找到拓扑序列,而不是 Tarjan 算法也可以呢?