2014-11-29 9 views
1

Я пытаюсь создать псевдокод для алгоритма, который сможет определить, имеет ли направленный граф уникальное топологическое упорядочение. Я уже придумал следующий псевдокод для топологической сортировки, но что мне нужно добавить или отредактировать, чтобы определить, имеет ли орграф уникальное топологическое упорядочение?Определить, имеет ли направленный граф уникальное топологическое упорядочение?

Input: A graph G 
Output: A list L that contain the sorted vertices 

define an empty list L; 
create a stack Stack; 
push all vertices with no incoming edges into Stack; 
while Stack is not empty do 

v ← Stack.pop(); 
add v to the list L; 

for all the vertices w with an edge e from v to w do 
remove edge e from G; 
if w has no other incoming edges then 
push w into Stack; 
if G has edges left then 
return error (graph G can’t be topological ordered); 
 else 
return L; 

ответ

0

Нет особой причины использовать стек, а не какой-либо другой коллекции. Если мы пэдем элементы недетерминированно, то мы можем реализовать все возможные топологические порядки. Таким образом, топологический порядок является уникальным тогда и только тогда, когда коллекция содержит один элемент каждый раз, когда мы выходим (кроме случаев, когда он пуст в конце).

+0

Ну ладно, поэтому каждый раз, когда я поплю, сохраняю элемент, которым он был, и если есть какие-то дубликаты, граф не имеет уникальной топологической сортировки? Это правильно? – Vimzy

+0

@Vimzy Да, если вы делаете два нажатия на одной итерации внешнего цикла, то топологический порядок не является уникальным. –