Given an undirected graph, return true if and only if it is bipartite.
Recall that a graph is bipartite if we can split it’s set of nodes into two independent subsets A
andB
such that every edge in the graph has one node inA
and another node in B
.
The graph is given in the following form: graph[i]
is a list of indexes j for which the edge between nodesi
andj
exists. Each node is an integer between0
and graph.length - 1
. There are no self edges or parallel edges:graph[i]
does not containi
, and it doesn’t contain any element twice.
Example 1:
Input: [[1,3], [0,2], [1,3], [0,2]]
Output:true
Explanation:
The graph looks like this:
0----1
| |
| |
3----2
We can divide the vertices into two groups: {0, 2}
and {1, 3}
.
Example 2:
Input:[[1,2,3], [0,2], [0,1,3], [0,2]]
Output: false
Explanation:
The graph looks like this:
0----1
| \ |
| \ |
3----2
We cannot find a way to divide the set of nodes into two independent subsets.
leetcode给我们标识了这是一道DFS搜索的题目,那么我们来解读下题目。
给我们一张无向图, 有n个节点,如果这个无向图可以被分为两个子图,使得原来的无向图graph
的没条边的两个端点都可以被划分到这两个子图中,如若不然,return false.
依然使用染色法,
1 - color
来继续DFS class Solution {
public boolean isBipartite(int[][] graph) {
int n = graph.length;
int[] colors = new int[n];
Arrays.fill(colors, -1);
for (int i = 0; i < n; i++) {
if (colors[i] == -1 && !validColor(graph, colors, 0, i)) {
return false;
}
}
return true;
}
public boolean validColor(int[][] graph, int[] colors, int color, int node) {
if (colors[node] != -1) {
return colors[node] == color;
}
colors[node] = color;
for (int next : graph[node]) {
if (!validColor(graph, colors, 1 - color, next)) {
return false;
}
}
return true;
}
}