785. Is Graph Bipartite?
by Botao Xiao
785. Is Graph Bipartite?
Question:
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 and B such that every edge in the graph has one node in A 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 nodes i and j exists. Each node is an integer between 0 and graph.length - 1. There are no self edges or parallel edges: graph[i] does not contain i, 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.
Note:
- graph will have length in range [1, 100].
- graph[i] will contain integers in range [0, graph.length - 1].
- graph[i] will not contain i or duplicate values.
- The graph is undirected: if any element j is in graph[i], then i will be in graph[j].
Solution:
- Method 1: dfs + bopartite
class Solution { private int[][] g; private int[] visited; public boolean isBipartite(int[][] graph) { g = graph; visited = new int[graph.length]; for(int i = 0; i < graph.length; i++){ if(visited[i] == 0){ if(!dfs(i, 1)) return false; } } return true; } private boolean dfs(int node, int color){ if(visited[node] == -color) return false; else if(visited[node] == color) return true; visited[node] = color; int[] neighbours = g[node]; for(Integer neighbour : neighbours){ if(!dfs(neighbour, -color)) return false; } return true; } }
- Method 2: bfs
class Solution { public boolean isBipartite(int[][] graph) { int[] visited = new int[graph.length]; Queue<Integer> queue = new LinkedList<>(); for(int i = 0; i < graph.length; i++){ if(visited[i] == 0){ visited[i] = 1; queue.offer(i); while(!queue.isEmpty()){ int cur = queue.poll(); for(Integer next : graph[cur]){ if(visited[next] == visited[cur]) return false; else if(visited[next] == 0){ visited[next] = -visited[cur]; queue.offer(next); } } } } } return true; } }
Subscribe via RSS