在Tar​​jan找到强连接组件后折叠顶点

时间:2013-08-16 07:43:35

标签: algorithm graph-algorithm tarjans-algorithm

假设在圆圈图中有许多顶点具有某些值。

在使用Tarjan找出这些SCC后,我想将每个SCC转换为两个顶点(不是一个),其中一个顶点在此SCC中具有最高值,另一个价值最低的。

让那些连接到这个SCC的顶点指向具有最低值的顶点,并让从SCC指向的顶点从具有最高值的顶点指向。

就像1(4) -> 2(3) <-> 3(5) -> 5(1) <-> 4(6) -> 1(4)一样,括号中的权重,即圆圈。我想把它翻译成像1(4) -> 2(3) -> 3(5) -> 4(1) -> 5(6) , 1(4) -> 4(1)

这样的东西

但我无法弄清楚如何实现这一点,请帮助。

我正在使用C和邻接列表来存储图表。

抱歉英语不好,我希望能够明白这一点。

1 个答案:

答案 0 :(得分:0)

以下想法可以帮助您入门:

  • 表示包含G的原始图表,使用S设置的scc,以及使用SG的互连sccs的新图表。
  • 您需要将顶点映射到scc scc: V(G) -> S,并将sccs映射到min和max值顶点min/max: S -> V(G),这些顶点可以在tarjan scc构造期间构建。
  • SG的顶点设置为min / max。
  • 的图像
  • 之后,您将通过迭代SG中的所有边(u,v)来构建E(G),为每个边(max(scc(u)),min(scc(v)))创建边E(SG),除非它已经存在。
  • s中的每个scc S添加(min(S), max(S))E(SG)

您可能需要考虑如何解决scc中max- / min-valuesd节点之间的联系。