Data structures 如何检测图是否是哈密顿图

Data structures 如何检测图是否是哈密顿图,data-structures,recursion,graph-algorithm,Data Structures,Recursion,Graph Algorithm,我有一个作业问题,要求实现接口方法isHamiltonian,我尝试使用递归来解决这个问题 如果有一条路径满足这些条件,则只需尝试来自一个节点的所有路径 只移动所有节点一次 最后一个节点直接连接到第一个节点 我会说这是哈密顿量 我已经尝试过这些代码,但它不起作用 public static boolean isHamiltonian(Graph g) throws InvalidGraphException { if (g == null || !(g instanceof Grap

我有一个作业问题,要求实现接口方法
isHamiltonian
,我尝试使用递归来解决这个问题

如果有一条路径满足这些条件,则只需尝试来自一个节点的所有路径

  • 只移动所有节点一次
  • 最后一个节点直接连接到第一个节点
我会说这是哈密顿量

我已经尝试过这些代码,但它不起作用

public static boolean isHamiltonian(Graph g) throws InvalidGraphException {
    if (g == null || !(g instanceof GraphI) || ((GraphI) g).getDirected()) {
        throw new InvalidGraphException();
    }

    NodeI[] nodes = (NodeI[]) g.nodes();
    if (nodes.length < 3)
        return false;

    return isHamiltonian(nodes[0], nodes[0], new HashSet<NodeI>());
}

private static boolean isHamiltonian(NodeI start, NodeI n, HashSet<NodeI> hs) {
    hs.add(n);
    NodeI[] nodes = n.getReachableNeighbours();
    boolean connectedWithStart = false;
    for (int i = 0; i < nodes.length; i++) {
        if (nodes[i].compareTo(start) == 0) {
            connectedWithStart = true;
            break;
        }
    }
    if (hs.size() == n.getGraph().nodes().length && connectedWithStart) {
        return true;
    }
    for (int i = 0; i < nodes.length; i++) {
        if (!hs.contains(nodes[i]))
            isHamiltonian(start, nodes[i], hs);
    }

    return false;
}
public静态布尔isHamiltonian(图g)抛出InvalidGraphException{
if(g==null | |!(g图形实例)| |((图形)g).getDirected()){
抛出新的InvalidGraphException();
}
NodeI[]节点=(NodeI[])g.nodes();
如果(节点长度<3)
返回false;
返回isHamiltonian(节点[0],节点[0],新HashSet());
}
私有静态布尔isHamiltonian(NodeI start、NodeI n、HashSet hs){
hs.加入(n);
NodeI[]nodes=n.GetReachableNeights();
boolean connectedWithStart=false;
对于(int i=0;i
在我看来,您的回溯是个问题。您贪婪地将节点添加到
hs
以构建路径,但当您无法完成循环/没有任何路可走时,您不会删除它们

我要做的第一件事是将
hs.remove(n)
放在最后一个
返回false
之前。然后我还将保存
isHamiltonian(start,nodes[I],hs)
的结果,并在为真时退出。像这样的

boolean result = isHamiltonian(start,nodes[i],hs);
if(result)return true;`
那应该能解决很多问题。我确实认为这种彻底的搜索将是相当缓慢的

编辑:整个过程应如下所示:

private static boolean isHamiltonian(NodeI start, NodeI n, HashSet<NodeI> hs) {
    hs.add(n);
    NodeI[] nodes = n.getReachableNeighbours();
    boolean connectedWithStart = false;
    for (int i = 0; i < nodes.length; i++) {
        if (nodes[i].compareTo(start) == 0) {
            connectedWithStart = true;
            break;
        }
    }
    if (hs.size() == n.getGraph().nodes().length && connectedWithStart) {
        return true;
    }
    for (int i = 0; i < nodes.length; i++) {
        if (!hs.contains(nodes[i])){
            boolean result=isHamiltonian(start, nodes[i], hs);
            if(result)return true;
        }
    }
    hs.remove(n);
    return false;
}
私有静态布尔isHamiltonian(NodeI start、NodeI n、HashSet hs){
hs.加入(n);
NodeI[]nodes=n.GetReachableNeights();
boolean connectedWithStart=false;
对于(int i=0;i

这个问题本身是NP难的,所以不要期望一般图的快速解。仔细阅读并决定是否值得花时间为您的应用程序实施。

不起作用。
是一个非常笼统的说法。什么不起作用?