如何构建一个数组来表示强连通组件中节点的关系?

时间:2018-02-02 17:49:10

标签: algorithm graph directed-graph strongly-connected-graph

对于带有 n 节点的有向图 G(V,E),我想创建一个整数数组 a ,其长度为名词的。如果存在从节点1到2的路径,那么a[1] <= a[2],如果它们位于相同的强连接组件a[1] = a[2]中,如果没有从节点2到3的路径,则我们有{{1 }}

我认为时间复杂度应该是O(n + m),因为寻求强连通分量的时间复杂度就是它。但我不知道如何为它输出数组,有人可以帮忙吗?感谢。

2 个答案:

答案 0 :(得分:1)

一旦找到了图的每个强连通分量(SCC),就可以通过将每个SCC收缩到一个顶点来构建图的condensation。缩合是一个有向无环图,您可以使用topological sorting对顶点进行编号。每一步都具有线性复杂性。

答案 1 :(得分:0)

Tarjan's SCC algorithm几乎已经完成了你想要的任务,你只需要一个额外的簿记步骤。

回想一下,Tarjan的SCC已经按照拓扑排序的顺序逐个输出强连接组件。也就是说,您所要做的就是将SCC的索引保存在与当前SCC的节点相对应的所有单元中。这已经是您想要的数组。

根据图表和实现的表示,您可能希望将N - idx保存在数组单元格中,其中N是找到的集群的总数。这是因为在遍历图形的方向上基本无关紧要:具有反向箭头的图形的强连通分量是相同的。这取决于具体实现中访问哪些更容易,更快捷。

Tarjan的算法遍历图表两次,并且具有O(| V | + | E |)运行时。保留一个额外的数组不会增加任何东西。