Алгоритм поиска пути Гамильтона в 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 образует Гамильтонов путь. Вам не нужно пересекать каждое ребро в графе, чтобы путь был Гамильтоновым.