LeetCode 785. Is Graph Bipartite?
Problem LeetCode 785. Is Graph Bipartite?
1. 题目简述 给出一个图,判断这个图是否为二分图。
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.
2. 算法思路 基础的染色二分图问题,但是要注意,对于整张图而言,它可能不是连通图,而是分为多个子图的,所以不能只遍历一种。
DFS BFS 3. 解法 DFS :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 class Solution { public boolean isBipartite (int [][] graph) { int [] color = new int [graph.length]; Arrays.fill(color, -1 ); for (int i = 0 ; i < graph.length; i++) { if (color[i] == -1 ) { color[i] = 0 ; if (!dfs(graph, i, color)) { return false ; } } } return true ; } private boolean dfs (int [][] graph, int index, int [] color) { for (int i = 0 ; i < graph[index].length; i++) { if (color[graph[index][i]] == -1 ) { color[graph[index][i]] = color[index] ^ 1 ; } else if (color[graph[index][i]] != color[index] ^ 1 ) { return false ; } } return true ; } }
BFS :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 class Solution { public boolean isBipartite (int [][] graph) { int n = graph.length; int [] color = new int [graph.length]; Arrays.fill(color, -1 ); for (int i = 0 ; i < n; i++) { if (color[i] == -1 ) { Queue<Integer> queue = new LinkedList(); queue.offer(i); color[i] = 0 ; while (!queue.isEmpty()) { int node = queue.poll(); for (int j = 0 ; j < graph[node].length; j++) { if (color[graph[node][j]] == -1 ) { color[graph[node][j]] = color[node] ^ 1 ; queue.offer(graph[node][j]); } else if (color[graph[node][j]] == color[node]) { return false ; } } } } } return true ; } }