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难的,所以不要期望一般图的快速解。仔细阅读并决定是否值得花时间为您的应用程序实施。
不起作用。
是一个非常笼统的说法。什么不起作用?