下面是用Java实现判断一个无向图是否为哈密顿图的代码:
import java.util.ArrayList;
import java.util.List;
public class HamiltonianGraph {
public static boolean isHamiltonianGraph(int[][] graph) {
int n = graph.length;
List<Integer> path = new ArrayList<>();
boolean[] visited = new boolean[n];
return findHamiltonianPath(0, graph, visited, path);
}
private static boolean findHamiltonianPath(int u, int[][] graph, boolean[] visited, List<Integer> path) {
int n = graph.length;
if (path.size() == n) {
return graph[u][0] == 1; // 判断是否存在从最后一个节点到起点的路径
}
visited[u] = true;
path.add(u);
for (int v = 0; v < n; v++) {
if (graph[u][v] == 1 && !visited[v]) {
if (findHamiltonianPath(v, graph, visited, path)) {
return true;
}
}
}
visited[u] = false;
path.remove(path.size() - 1);
return false;
}
public static void main(String[] args) {
int[][] graph = {
{0, 1, 0, 1, 0},
{1, 0, 1, 1, 1},
{0, 1, 0, 0, 1},
{1, 1, 0, 0, 1},
{0, 1, 1, 1, 0}
};
boolean isHamil = isHamiltonianGraph(graph);
System.out.println("Is Hamiltonian graph? " + isHamil);
}
}
这个实现使用了递归的方式,在图中查找哈密顿路径(Hamiltonian Path)。其中`graph`是一个二维邻接矩阵,`visited`是一个标记数组,记录每个节点是否被访问过。函数`findHamiltonianPath`的参数`u`是当前处理的节点,`path`是已经走过的路径。
在每次递归中,如果`path`中已经包含了所有的节点,则判断是否存在从最后一个节点到起点的路径,即判断矩阵中`graph[u][0]`是否为1。如果不是,则递归回溯,尝试其它的选择路径。