我想列出一个根节点(Tarjan的索引0)在一个无向多图中的循环,它在根节点开始和结束,而不通过先前访问过的节点返回一个循环周期。
我使用这些说明Tarjan's strongly connected components algorithm在perl中编写了Cycle detection in a Multigraph。 这是我的图表
V E E E
1 2 3 4
2 1 3
3 1 2
4 1
我得到了这个结果
1 root
3 2 1
------------
2 root
3 1 2
------------
3 root
2 1 3
------------
4 root
3 2 1 4
------------
当选择4作为索引0或根目录时我希望它返回1 4,因为路径必须通过1两次以完成循环,解决方案为3 2 1 4。
谢谢
答案 0 :(得分:0)
使用邻居搜索更改Tarjan's strongly connected components algorithm以确保每个节点共享边缘满足我的需求。它省略了一些解决方案。
for each v in V do
index := 0
S := empty
strongconnect(v)
repeat
...
while (w != v)
if (loopcount = 0)
w:=v
else
w := S.pop()
end if
while (continuation = false)
x := S.pop()
for each (y, x) in E do
if (y = w) then
continuation = true
end if
repeat
if (x = v) then
continuation = true
S.push(v)
loopcount := loopcount+1
if(continuation = true)
add x to current strongly connected component
endif
repeat
2
8 3 1 6
4 7
5
1 2 5
2 3 6 1
3 4 2 8
4 3 5
5 4 7 1
6 2 7
7 5 6
8 3
1 list
5 4 3 2 1
------------
2 list
1 5 4 3 2
------------
3 list
8 3
------------
4 list
5 7 6 2 3 4
------------
5 list
1 2 3 4 5
------------
6 list
7 5 4 3 2 6
------------
7 list
6 2 3 4 5 7
------------
8 list
3 8
------------