class Solution {
public:
bool isBipartite(vector<vector<int>>& graph) {
}
};
剑指 Offer II 106. 二分图
存在一个 无向图 ,图中有 n
个节点。其中每个节点都有一个介于 0
到 n - 1
之间的唯一编号。
给定一个二维数组 graph
,表示图,其中 graph[u]
是一个节点数组,由节点 u
的邻接节点组成。形式上,对于 graph[u]
中的每个 v
,都存在一条位于节点 u
和节点 v
之间的无向边。该无向图同时具有以下属性:
graph[u]
不包含 u
)。graph[u]
不包含重复值)。v
在 graph[u]
内,那么 u
也应该在 graph[v]
内(该图是无向图)u
和 v
之间可能不存在一条连通彼此的路径。二分图 定义:如果能将一个图的节点集合分割成两个独立的子集 A
和 B
,并使图中的每一条边的两个节点一个来自 A
集合,一个来自 B
集合,就将这个图称为 二分图 。
如果图是二分图,返回 true
;否则,返回 false
。
示例 1:
输入:graph = [[1,2,3],[0,2],[0,1,3],[0,2]]
输出:false
解释:不能将节点分割成两个独立的子集,
以使每条边都连通一个子集中的一个节点与另一个子集中的一个节点。
示例 2:
输入:graph = [[1,3],[0,2],[1,3],[0,2]]
输出:true
解释:可以将节点分成两组: {0, 2} 和 {1, 3} 。
提示:
graph.length == n
1 <= n <= 100
0 <= graph[u].length < n
0 <= graph[u][i] <= n - 1
graph[u]
不会包含 u
graph[u]
的所有值 互不相同graph[u]
包含 v
,那么 graph[v]
也会包含 u
注意:本题与主站 785 题相同: https://leetcode.cn/problems/is-graph-bipartite/
原站题解
golang 解法, 执行用时: 28 ms, 内存消耗: 6.4 MB, 提交时间: 2022-11-23 17:09:12
var ( UNCOLORED, RED, GREEN = 0, 1, 2 ) func isBipartite(graph [][]int) bool { n := len(graph) color := make([]int, n) for i := 0; i < n; i++ { if color[i] == UNCOLORED { queue := []int{} queue = append(queue, i) color[i] = RED for i := 0; i < len(queue); i++ { node := queue[i] cNei := RED if color[node] == RED { cNei = GREEN } for _, neighbor := range graph[node] { if color[neighbor] == UNCOLORED { queue = append(queue, neighbor) color[neighbor] = cNei } else if color[neighbor] != cNei { return false } } } } } return true }
golang 解法, 执行用时: 20 ms, 内存消耗: 6.5 MB, 提交时间: 2022-11-23 17:08:58
var ( UNCOLORED, RED, GREEN = 0, 1, 2 color []int valid bool ) func isBipartite(graph [][]int) bool { n := len(graph) valid = true color = make([]int, n) for i := 0; i < n && valid; i++ { if color[i] == UNCOLORED { dfs(i, RED, graph) } } return valid } func dfs(node, c int, graph [][]int) { color[node] = c cNei := RED if c == RED { cNei = GREEN } for _, neighbor := range graph[node] { if color[neighbor] == UNCOLORED { dfs(neighbor, cNei, graph) if !valid { return } } else if color[neighbor] != cNei { valid = false return } } }
python3 解法, 执行用时: 44 ms, 内存消耗: 15.3 MB, 提交时间: 2022-11-23 17:08:36
class Solution: def isBipartite(self, graph: List[List[int]]) -> bool: n = len(graph) UNCOLORED, RED, GREEN = 0, 1, 2 color = [UNCOLORED] * n for i in range(n): if color[i] == UNCOLORED: q = collections.deque([i]) color[i] = RED while q: node = q.popleft() cNei = (GREEN if color[node] == RED else RED) for neighbor in graph[node]: if color[neighbor] == UNCOLORED: q.append(neighbor) color[neighbor] = cNei elif color[neighbor] != cNei: return False return True
python3 解法, 执行用时: 36 ms, 内存消耗: 15.5 MB, 提交时间: 2022-11-23 17:08:20
class Solution: def isBipartite(self, graph: List[List[int]]) -> bool: n = len(graph) UNCOLORED, RED, GREEN = 0, 1, 2 color = [UNCOLORED] * n valid = True def dfs(node: int, c: int): nonlocal valid color[node] = c cNei = (GREEN if c == RED else RED) for neighbor in graph[node]: if color[neighbor] == UNCOLORED: dfs(neighbor, cNei) if not valid: return elif color[neighbor] != cNei: valid = False return for i in range(n): if color[i] == UNCOLORED: dfs(i, RED) if not valid: break return valid