2010-11-11 3 views
6

Рассмотрим следующий алгоритм топологической сортировки, приведенной в моем учебнике:Топологическая сортировка

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" 

Я попытался реализации алгоритма слово за словом, но обнаружил, что он всегда жаловался на дицикл, был ли граф ациклический или не. Затем я обнаружил, что последние две строки не подходят правильно. Цикл while непосредственно перед его завершением, когда S пуст. Таким образом, каждый раз, он уверен, что условие if будет оставаться верным.

Как исправить этот алгоритм, чтобы правильно проверить велосипед?

Edit:

В настоящее время я просто обходя проблему S, путем проверки значения I в конце:

if i != n + 1 
    return "G has a dicycle" 

ответ

5

Ваше исправление правильно. Если вы не нажимали все узлы в графе на S, граф содержит хотя бы один сильно связанный компонент. Другими словами, у вас есть цикл.

 Смежные вопросы

  • Нет связанных вопросов^_^