Найдите числовой порядок топологической сортировки

У меня есть ациклический граф с числовой меткой в ​​каждой вершине, которую я хочу найти Топологической сортировкой для этого графа; однако граф может содержать несколько топологических порядков, но я хочу найти конкретный порядок, в котором номера вершин имеют числовой порядок, см. рисунок ниже для более подробного объяснения введите описание изображения здесь

Как вы можете видеть на картинке выше, этот граф содержит несколько топологических порядков
4 5 6 1 2 3
1 4 2 5 6 3
1 2 4 5 3 6
1 2 3 4 5 6 < br> ......
Но мне нужен этот порядок 1 2 3 4 5 6 Я хочу знать, как мне изменить алгоритм топологической сортировки, чтобы найти этот конкретный порядок

Вот еще один пример:
 введите описание изображения здесь
В примере графика эти два порядка верны
2 1 0
Но когда я использую первую функцию сортировки ответов он поменяет местами 2 и 0, и окончательный результат будет 0 1 2, и это неправильный ответ


person Daniel.V    schedule 25.10.2016    source источник
comment
Вы проверили ответ, который я написал?   -  person Shasha99    schedule 26.10.2016
comment
@ Shasha99 да, но ваш ответ работает не для всех тестовых случаев   -  person Daniel.V    schedule 26.10.2016
comment
Не могли бы вы сообщить мне о неудачном тесте? Я пробежал несколько без проблем.   -  person Shasha99    schedule 26.10.2016
comment
Я редактирую свой вопрос и добавляю новый пример, ваш ответ не работает в этом примере   -  person Daniel.V    schedule 26.10.2016
comment
Если метод сравнения возвращает false, это означает, что node1 больше, чем node2. Вы предполагаете то же самое?   -  person Shasha99    schedule 26.10.2016
comment
Я выполнил то же самое для вашего второго тестового примера, и он дает ожидаемый результат. Вы можете проверить здесь: code.hackerearth.com/9cc721w   -  person Shasha99    schedule 26.10.2016
comment
Извините, я изменил свой пример на новый, и этот не работает с вашим решением   -  person Daniel.V    schedule 26.10.2016
comment
Давайте продолжим это обсуждение в чате.   -  person Shasha99    schedule 26.10.2016
comment
Обновил свой ответ и упомянул, что для сортировки можно использовать только пузырьковую сортировку.   -  person Shasha99    schedule 27.10.2016


Ответы (1)


Лучше, если вы выполните еще одну сортировку на выходе вашего алгоритма топологической сортировки и используете следующую функцию сравнения при сортировке:

//Suppose we have a method which returns true if an edge exists between two nodes.
//returns false otherwise.
edgeExists(node1,node2) ==true  // node1->node2

//The compare function
//consider node.value as vertex number.
bool compare(node1, node2){
    if(node1.value > node2.value && !edgeExists(node1,node2))
         return false;

    return true;
}

Ниже приведена оптимизация метода сравнения, предложенная @Gene:

bool compare(node1, node2){
      return (edgeExists(node1,node2) || node1.value < node2.value) ;
}

Следует учитывать одну очень важную вещь: этот метод сравнения будет работать правильно только в том случае, если переданные вершины идут последовательно в указанном топологическом порядке.

Поэтому нам нужно выбрать алгоритм сортировки, который всегда сравнивает только последовательные элементы. Да, пузырьковый !!!

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

person Shasha99    schedule 25.10.2016
comment
Незначительное улучшение состояния if !!! Изменен порядок выражений. - person Shasha99; 26.10.2016
comment
Если вы все равно делаете полностью упорядоченную сортировку, то предварительная топосортировка будет пустой тратой. Просто расширите частичный порядок до полного, как вы это сделали, и используйте стандартную системную сортировку. @ Daniel.V примечание! Более здравый способ дать сравнение - return edge(a, b) || a.value <= b.value. Значение состоит в том, чтобы либо соблюдать частичный порядок, если a и b связаны им, либо выбрать порядок с метками узлов. - person Gene; 26.10.2016