Tarjan的循环循环多图独特节点

时间:2013-03-15 05:05:17

标签: algorithm graph

我想列出一个根节点(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。

谢谢

1 个答案:

答案 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 
------------