Video is forĀ č±č±é ± LeetCode 886. Possible Bipartition, but the algorithm is exact the same.
Problem
https://leetcode.com/problems/is-graph-bipartite/
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: Graph Coloring
For each node
- If has not been colored, color it to RED(1).
- Color its neighbors with a different color RED(1) to BLUE(-1) or BLUE(-1) to RED(-1).
If we can finish the coloring then the graph is bipartite. All red nodes on the left no connections between them and all blues nodes on the right, again no connections between them. red and blue nodes are neighbors.
Time complexity: O(V+E)
Space complexity: O(V)
C++ / DFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// Author: Huahua // Running time: 12 ms class Solution { public: bool isBipartite(vector<vector<int>>& graph) { const int n = graph.size(); vector<int> colors(n); for (int i = 0; i < n; ++i) if (!colors[i] && !coloring(graph, colors, 1, i)) return false; return true; } private: bool coloring(const vector<vector<int>>& graph, vector<int>& colors, int color, int node) { if (colors[node]) return colors[node] == color; colors[node] = color; for (int nxt : graph[node]) if (!coloring(graph, colors, -color, nxt)) return false; return true; } }; |