Определить, имеет ли ориентированный граф уникальный топологический порядок?

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

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;

person Vimzy    schedule 29.11.2014    source источник


Ответы (1)


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

person David Eisenstat    schedule 29.11.2014
comment
О, хорошо, так что каждый раз, когда я выталкиваю, сохраняйте элемент, который был, и если есть какие-то дубликаты, граф не имеет уникальной топологической сортировки? Это правильно? - person Vimzy; 29.11.2014
comment
@Vimzy Да, если вы делаете два нажатия за одну итерацию внешнего цикла, то топологический порядок не уникален. - person David Eisenstat; 29.11.2014