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

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

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

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

мой подход,

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

какие предложения?

2 ответов


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

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

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

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

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

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


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

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