我有一个作业问题,要求实现接口方法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;
}