假设在圆圈图中有许多顶点具有某些值。
在使用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和邻接列表来存储图表。
抱歉英语不好,我希望能够明白这一点。
答案 0 :(得分:0)
以下想法可以帮助您入门:
G
的原始图表,使用S
设置的scc,以及使用SG
的互连sccs的新图表。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节点之间的联系。