public static boolean isEulerian(int[][] graph) {
int vertexCount = graph.length;
// 判断是否联通
if (!isConnected(graph, vertexCount)) {
return false;
}
// 判断是否存在奇数度顶点
for (int i = 0; i < vertexCount; i++) {
if (getDegree(graph, i) % 2 == 1) {
return false;
}
}
return true;
}
public static boolean isConnected(int[][] graph, int vertexCount) {
boolean[] visited = new boolean[vertexCount];
int count = 0;
// 使用 DFS 搜索所有联通分量
dfs(graph, visited, 0);
for (int i = 0; i < vertexCount; i++) {
if(visited[i]) {
count++;
}
}
return count == vertexCount;
}
public static int getDegree(int[][] graph, int vertex) {
int degree = 0;
int vertexCount = graph.length;
for (int i = 0; i < vertexCount; i++) {
if (graph[vertex][i] == 1) {
degree++;
}
}
return degree;
}
public static void dfs(int[][] graph, boolean[] visited, int vertex) {
visited[vertex] = true;
int vertexCount = graph.length;
for (int i = 0; i < vertexCount; i++) {
if (graph[vertex][i] == 1 && !visited[i]) {
dfs(graph, visited, i);
}
}
}
其中,isEulerian 方法接受一个邻接矩阵 graph,用于判断是否是欧拉图。首先判断图是否连通,如果不连通,则直接返回 false。然后再判断每个顶点的度数是否都是偶数,如果存在奇数度顶点则返回 false。
isConnected 方法用于判断是否连通,采用 DFS 遍历所有连通分量。getDegree 方法用于获取一个顶点的度数。dfs 方法用于遍历所有连通分量。