显然,如果图形甚至没有汉密尔顿路径,它就没有汉密尔顿循环,所以if (!g.hp()) return false;
但是之后我有点失落。
课堂上给出的提示是添加一些顶点。我的想法是,如果图形在添加顶点之前具有哈密顿路径并且添加顶点意味着图形不再具有哈密顿路径,则原始图形具有哈密顿循环。
当然,我不是在寻找伪代码或代码,我只是想把它推向正确的方向。
编辑:维基百科页面提到您可以使用汉密尔顿路径例程通过将附加顶点连接到上一个图中的每个顶点来查找它是否具有哈密顿循环。那是为什么?
答案 0 :(得分:1)
以这种方式思考 - 哈密顿循环只是一条哈密顿路径,它在路径的端点之间有一条边。同样地,从哈密顿循环中移除任何单个边缘导致哈密顿路径。这意味着如果要通过单个边缘将顶点连接到单个现有顶点来向图形添加顶点,则新图形中仍然会有哈密顿路径。无论你在哪里插入新的顶点,这都是正确的。
这也意味着如果图中存在一个顶点,以便将其连接到具有单个边的单个新顶点,则会产生一个没有哈密顿路径的新图,那么该图没有哈密顿循环(我怀疑你的教授)希望你通过矛盾证明这一点,所以我会把它留给你)。您可以使用该事实来创建Hamiltonian Cycle算法。我知道你没有要求伪代码,但无论如何我都会给你一些:
boolean hc(Graph g){
if(!g.hp()) return false;
Vertex test = new Vertex();
for(Vertex v : g){
g.connect(test,v); //adds single edge between test and v
if(!g.hp()) return false;
g.disconnect(test,v); //removes any edges between test and v
}
//every test yielded a new graph with a Hamiltonian Path, therefore
//g must have a Hamiltonian Cycle:
return true;
}