Уникальная топологическая сортировка для DAG с несколькими решениями tsort

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

Например, возьмем этот график:

A-->B

A-->C

B-->D

C-->D

Есть два решения топологической сортировки:

1: А, В, С, D и

2: A, C, B, D

Заметим, что B и C можно сортировать в любом порядке. Поэтому мы выбираем алфавитную сортировку в качестве вторичной сортировки, чтобы получить только одно решение: A, B, C, D.

Можно ли это обобщить на любой DAG и как это реализовать?


person XPlatformer    schedule 16.08.2016    source источник
comment
Ответ jcm69 можно найти здесь: math.stackexchange .com/questions/2051092/   -  person XPlatformer    schedule 09.08.2017


Ответы (2)


Таким образом, вопрос, который вы задаете, больше относится к семантике программирования, чем к самому алгоритму. Алгоритм топологической сортировки на базовом уровне предполагает, что пользователь будет корректировать алгоритм с учетом того, что ему/ей может потребоваться от алгоритма. Таким образом, чтобы получить решение ABCD, а не решение ACBD, вам нужно будет утверждать в своем алгоритме, что в ситуации, когда есть два возможных кандидата, будет выбран символ с алфавитным приоритетом. Чтобы обобщить это на любой DAG, вы просто указываете его в своем алгоритме.

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

person Viky    schedule 29.11.2018

Разве вы не можете использовать стандартную топологическую сортировку с функцией разрешения конфликтов? То есть не используйте подход DFS, а итеративно (или рекурсивно) удаляйте и ставьте в очередь вершины без оставшихся ограничений. Каждый раз, когда доступно более одной неограниченной вершины, используйте функцию разрешения конфликтов для выбора между ними. Ваша функция прерывания связи будет (как я понимаю вашу проблему) просто выбрать вершину, метка которой появляется первой в алфавитном порядке.

person Jim Newton    schedule 30.01.2019