algorithm - 寻找强连通分量 - Kosaraju 算法

标签 algorithm graph

在有向图中,要找到强连通分量(使用 Kosaraju 算法),如果我们可以在完成时间之前使用节点的反向列表然后遍历原始图,为什么我们必须转置邻接矩阵(反转所有边的方向) . 换句话说,我们会找到所有顶点的完成时间并开始从最低完成时间遍历到最大(通过增加完成时间)?

此外,如果我们对某些 DAG 进行拓扑排序,然后反转边(转置邻接矩阵)并再次进行拓扑排序 - 我们是否应该以相反的顺序得到相等的数组?

最佳答案

这不会给 SCC。考虑 2 个子图 S1 和 S2。为了使 S1 和 S2 都成为单个 SCC 的一部分,应该有一条从 S1 到 S2 以及从 S2 到 S1 的路径。按照您提到的方式,即使只有从 S1 到 S2 的路径,它也会将它们计为单个 SCC。 原始图和反向图上的 DFS 确保只有在两个方向上都有路径的组件才会在 SCC 内组合。

Additionally, if we do topological sorting on some DAG, and then reverse edges (transpose adjacency matrix) and do topological sorting again - should we get to equal arrays, just in reversed order?

不一定。考虑一个简单的例子 (1->2,1->3) .Topological sort=(1,2,3)。反转图(2->1,3->1)。拓扑排序(2,3,1)

关于algorithm - 寻找强连通分量 - Kosaraju 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21061507/

相关文章:

algorithm - 是否有用于类似堆栈的对象的可推送/可弹出哈希函数?

python - 动态规划: find the maximum revenue

c++ - Lemon Graph Library C++ 在节点中添加坐标

algorithm - 我怎样才能找到最小化边数的方法?

具有 max_element 和迭代器的 c++ 函数 = 慢 3 倍

Python 奇怪的返回问题

c++ - boost 图 : dijkstra_shortest_paths: cannot form a reference to 'void'

algorithm - 最小生成树子图

c - 在图上搜索顶点的最佳和最简单算法?

algorithm - 将数字列表排序为交替的低-高-低序列的最有效方法是什么?