Алгоритм Канса работает, выбирая узел с степенью 0 и удаляя все его исходящие ребра (что может привести к появлению новых узлов с степенью 0).Если больше нет узлов с нулевой степенью 0 (и график сейчас не пуст), он содержит цикл.
Чтобы напечатать цикл, начните с любого места и следуйте за входящими ребрами.Поскольку существует конечное число узлов, в какой-то момент вы должны достичь узла во второй раз.Это ваш цикл, чтобы напечатать его, просто запустите его в другой раз.
Скажем, наш график:
a --> b
b --> c, d
c --> b
инверсия этого графика тогда равна
a <--
b <-- a, c
c <-- b
d <-- b
Топологическая сортировка начинается с a
, удаляет ее.b
сейчас равно b <-- c
Теперь мы начинаем где угодно, скажем, d
и ищем в обратном направлении.
d <-- b <-- c <-- b
Поскольку мы видели b
ранее, это должно бытьчасть цикла.Для печати мы снова переходим по ссылкам и получаем b <-- c <-- b
.
Если бы был какой-либо тупик, такой как a
, он был бы удален алгоритмом топологической сортировки уже до обнаружения цикла.