Перечисление циклов в графе с использованием алгоритма Тарьяна

Я пытаюсь определить циклы в ориентированном графе, используя алгоритм Тарьяна, представленный в его исследовательской работе «Перечисление элементарных цепей ориентированного графа» от сентября 1972 года.

Я использую 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

Алгоритм Тарьяна обнаруживает следующие циклы:

[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]

Я также сделал алгоритм Тирнана, и он (правильно) находит 2дополнительный циклы:

[3,4]

[3,6,5]

Я был бы признателен за помощь в выяснении, почему Тарьян пропускает эти 2 цикла. Возможно, проблема в моем коде?

Ответы на вопрос(1)

Ваш ответ на вопрос