判定二分图的代码逻辑可以这样写:
/* 图遍历框架 */
void traverse(Graph graph, boolean[] visited, int v) {
visited[v] = true;
// 遍历节点 v 的所有相邻节点 neighbor
for (int neighbor : graph.neighbors(v)) {
if (!visited[neighbor]) {
// 相邻节点 neighbor 没有被访问过
// 那么应该给节点 neighbor 涂上和节点 v 不同的颜色
traverse(graph, visited, neighbor);
} else {
// 相邻节点 neighbor 已经被访问过
// 那么应该比较节点 neighbor 和节点 v 的颜色
// 若相同,则此图不是二分图
}
}
}
图的遍历框架(深度优先搜索)
private void traverse(List<Integer>[] graph, int v) {
if (!ok) return;
// 前序遍历位置,标记节点 v 已访问
visited[v] = true;
for (int w : graph[v]) {
if (!visited[w]) {
color[w] = !color[v];
// 只遍历没标记过的相邻节点
traverse(graph, w);
} else {
if (color[w] == color[v]) {
ok = false;
}
}
}
}