1972 年 9 月の彼の研究論文「有向グラフの基本回路の列挙」で発表されたタージャンのアルゴリズムを使用して、有向グラフのサイクルを決定しようとしています。
Python を使用してアルゴリズムをコーディングし、隣接リストを使用してノード間の関係を追跡しています。
したがって、以下の「G」では、ノード 0 はノード 1 を指し、ノード 1 はノード 4、6、7 を指します... などです。
G = [[1], [4, 6, 7], [4, 6, 7], [4, 6, 7], [2, 3], [2, 3], [5, 8], [5, 8], [], []]
N = len(G)
points = []
marked_stack = []
marked = [False for x in xrange(0,N)]
g = None
def tarjan(s, v, f):
global g
points.append(v)
marked_stack.append(v)
marked[v] = True
for w in G[v]:
if w < s:
G[v].pop(G[v].index(w))
elif w == s:
print points
f = True
elif marked[w] == False:
if f == g and f == False:
f = False
else:
f = True
tarjan(s, w, g)
g = f
if f == True:
u = marked_stack.pop()
while (u != v):
marked[u] = False
u = marked_stack.pop()
#v is now deleted from mark stacked, and has been called u
#unmark v
marked[u] = False
points.pop(points.index(v))
for i in xrange(0,N):
marked[i] = False
for i in xrange(0,N):
points = []
tarjan(i,i, False)
while (len(marked_stack) > 0):
u = marked_stack.pop()
marked[u] = False
Tarjan のアルゴリズムは、次のサイクルを検出します。
[2、4]
[2, 4, 3, 6, 5]
[2, 4, 3, 7, 5]
[2、6、5]
[2, 6, 5, 3, 4]
[2、7、5]
[2、7、5、3、4]
[3、7、5]
Tiernanのアルゴリズムも実行しましたが、(正しく)2つの余分なサイクルが見つかりました:
[3,4]
[3,6,5]
Tarjan がこれらの 2 サイクルをスキップする理由を見つけるための助けをいただければ幸いです。おそらく私のコードの問題ですか?