Каков алгоритм динамического программирования для нахождения Гамильтонова цикла в графе?
каков алгоритм динамического программирования для нахождения Гамильтонова цикла в неориентированном графе?
Я где-то видел, что существует алгоритм с O(n.2^n)
сложность времени.
2 ответов
действительно есть O (n2n) алгоритм динамического программирования для нахождения гамильтоновых циклов. Идея, которая является общей, которая может уменьшить многие O (n!) обратные подходы к O (N22n) или O (n2n) (за счет использования большего объема памяти), следует рассмотреть подзадачи, которые наборы с указанными "конечными точками".
здесь, так как вы хотите цикл, вы можете начать с любой вершины. Так что исправь одну, назови ее. x
. Подзадачи будут: "для данного набора S
и вершины v
на S
, есть ли путь, начинающийся с x
и проходя через все вершины S
до v
?- Назовите это, скажем,poss[S][v]
.
как и в большинстве проблем динамического программирования, как только вы определяете подзадачи, остальное очевидно: цикл над всеми 2n устанавливает s вершин в любом "возрастающем" порядке, и для каждого v в каждом таком S Вы можете вычислить poss[S][v]
as:
poss[S][v] = (существует некоторое
u
в S такое, что poss[S - {v}][u] истинно и ребро )
наконец, существует Гамильтонов цикл, если существует вершина v
таких, что ребро и poss[S][v]
верно, где S
- множество всех вершин (кроме x
в зависимости от того, как ты его определил).
если вы хотите фактический Гамильтонов цикл, а не просто решить, является ли один существует или нет, сделать poss[S][v]
сохранить фактическое u
это сделало возможным вместо того, чтобы просто истинно или ложно; таким образом, вы можете проследить путь в конце.
Я не могу вырвать этот конкретный алгоритм, но есть больше о гамильтоновых циклах на Страница Гамильтона чем вы, вероятно, когда-нибудь понадобится. :)
эта страница намерена быть полный перечень документов, исходный код, препринты, технические отчеты и т. д., доступные на Интернет о Гамильтоновом цикле и проблемы Гамильтонова пути как некоторые связанные проблемы.
(исходный URL-адрес, в настоящее время 404), (Интернет-Архив)