C++ 检查稠密图中是否存在Hamilton圈

C++ 检查稠密图中是否存在Hamilton圈,c++,graph,hamiltonian-cycle,C++,Graph,Hamiltonian Cycle,首先有几个定义: 定义1 图G=(V,E)称为“稠密的”,如果对于每对非相邻顶点u和V,d(u)+d(V)>=n 其中n=| V |和d(*)表示顶点的阶数* 定义2 G上的“哈密顿圈”是顶点序列(vi1,vi2,….vin,vi1),使得vil!=为了我所有的人=h和{vil,vil}是G的边 问题是:编写一个程序,给定一个稠密无向图G=(V;E)作为输入,确定G是否允许G上的哈密顿循环并输出该循环(如果有),或者如果没有,则输出“N” 我的解决方案是找到从一个源开始的所有可能路径,并检查是否

首先有几个定义:

定义1

图G=(V,E)称为“稠密的”,如果对于每对非相邻顶点u和V,d(u)+d(V)>=n 其中n=| V |和d(*)表示顶点的阶数*

定义2

G上的“哈密顿圈”是顶点序列(vi1,vi2,….vin,vi1),使得vil!=为了我所有的人=h和{vil,vil}是G的边

问题是:编写一个程序,给定一个稠密无向图G=(V;E)作为输入,确定G是否允许G上的哈密顿循环并输出该循环(如果有),或者如果没有,则输出“N”

我的解决方案是找到从一个源开始的所有可能路径,并检查是否存在返回该源的路径。不幸的是,这种解决方案效率不高


有什么建议吗?谢谢。

这个问题是NP难的。因此,我不希望任何解决方案比暴力更快。

根据,满足定义1的图总是有一个哈密顿循环,并且会给你一个O(n2)中的哈密顿循环。

使用动态规划来做这项工作。虽然上面的帖子提到了它,但我也会提到它以节省一些搜索时间-存在一个算法,但这不是多项式时间。哈密顿圈的判定形式是NP难的。你不会找到一个“有效”的解决方案——好吧,如果你找到了,那么计算机科学界会很乐意听到的根据Ore定理(),满足定义1的图总是有一个哈密顿圈。哇…这是真的@Tamás…。谢谢!即使在稠密图上也是NP难的吗?@avakar:不,不是;看我的答案。这是一个技巧…因为给定的图是稠密的,所以它有哈密顿路径!但是Tamas,您还应该输出不会改进解决方案的路径!哦,很抱歉,当我回答这个问题时,密度的定义没有包括在问题中,所以我只回答了一般情况。