Подтвердить что ты не робот

Алгоритм поиска пути Гамильтона в DAG

Я имею в виду книгу Скенны по алгоритмам.

Проблема проверки того, содержит ли граф G a Hamiltonian path NP-hard, где путь гамильтониана P - это путь, который посещает каждую вершину ровно один раз. Нет необходимости иметь ребро в G от конечной вершины до начальной вершины P, в отличие от проблемы гамильтонова цикла.

Учитывая направленный ациклический граф G (DAG), дайте алгоритм времени O(n + m) для проверки того, содержит ли он гамильтонов путь.

Мой подход,

Я планирую использовать DFS и Topological sorting. Но я не знал, как связать две концепции в решении проблемы. Как можно определить топологическую сортировку для определения решения.

Любые предложения?

4b9b3361

Ответ 1

Вы можете сначала топологически отсортировать DAG (каждая DAG может быть топологически отсортирована) в O (n + m).

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

(1,2), (2,3), ..., (n-1,n).

(Это потому, что в гамильтоновском пути вы не можете "вернуться", но все же вам нужно посетить всех, поэтому единственный способ - "не пропустить" )

Вы можете проверить это условие в O (n).

Таким образом, общая сложность O (m + n).

Ответ 2

Я не думаю, что выражение от @agassaa совершенно верно. Рассмотрим простой пример, где есть три узла "A", "B", "C" и ребра A- > B, B- > C, A- > C. В то время как A имеет двух детей, а C имеет двух родителей, A- > B- > C образует гамильтонов путь. Вам не нужно перемещать каждое ребро в графе, чтобы путь был гамильтониан.

DAG, который имеет гамильтоновский цикл