топологическая сортировка
рассмотрим следующий алгоритм топологической сортировки, приведенный в моей книжке:
Input: A digraph G with n vertices
Output: A topological ordering v1,v2...vn of G, or the non-existence thereof.
S is an empty stack
for each vertex u in G do
incount(u) = indeg(u)
if incount(u) == 0 then
S.push(u)
i = 1
while S is non-empty do
u = S.pop()
set u as the i-th vertex vi
i ++
for each vertex w forming the directed edge (u,w) do
incount(w) --
if incount(w) == 0 then
S.push(w)
if S is empty then
return "G has a dicycle"
Я попытался реализовать алгоритм слово в слово, но обнаружил, что он всегда жаловался на дицикл, был ли граф ациклическим или нет. Затем я обнаружил, что последние 2 строки не вписываются правильно. Цикл while непосредственно перед ним завершается, когда S пуст. Таким образом, каждый раз гарантируется, что условие if будет выполняться.
Как я могу исправить этот алгоритм правильно проверить dicycle?
Edit:
В настоящее время я просто обхожу проблему S, проверяя значение i в конце:
if i != n + 1
return "G has a dicycle"
1 ответов
ваше исправление верно. Если вы не нажмете все узлы в графике на S
, график содержит по крайней мере один сильно связанный компонент. Другими словами, у вас есть цикл.