Leetcode 785.判斷二分圖
1 題目描述(Leetcode題目鏈接)
給定一個無向圖graph,當這個圖爲二分圖時返回true。
如果我們能將一個圖的節點集合分割成兩個獨立的子集A和B,並使圖中的每一條邊的兩個節點一個來自A集合,一個來自B集合,我們就將這個圖稱爲二分圖。
graph將會以鄰接表方式給出,graph[i]表示圖中與節點i相連的所有節點。每個節點都是一個在0到graph.length-1之間的整數。這圖中沒有自環和平行邊: graph[i] 中不存在i,並且graph[i]中沒有重複的值。
示例 1:
輸入: [[1,3], [0,2], [1,3], [0,2]]
輸出: true
解釋:
無向圖如下:
0----1
| |
| |
3----2
我們可以將節點分成兩組: {0, 2} 和 {1, 3}。
示例 2:
輸入: [[1,2,3], [0,2], [0,1,3], [0,2]]
輸出: false
解釋:
無向圖如下:
0----1
| \ |
| \ |
3----2
我們不能將節點分割成兩個獨立的子集。
注意:
- graph 的長度範圍爲 [1, 100]。
- graph[i] 中的元素的範圍爲 [0, graph.length - 1]。
- graph[i] 不會包含 i 或者有重複的值。
- 圖是無向的: 如果j 在 graph[i]裏邊, 那麼 i 也會在 graph[j]裏邊。
2 題解
圖論中的一個定理:一個圖是二部圖(此題說的是二分圖)當且僅當它不包含奇環。因此我們只需要判斷圖中是否包含奇環就可以了。
class Solution:
def dfs(self, u, depth):
self.visited[u] = depth
for v in self.graph[u]:
if self.visited[v] and (depth - self.visited[v]) % 2 == 0:
return False
elif not self.visited[v] and not self.dfs(v, depth + 1):
return False
return True
def isBipartite(self, graph: List[List[int]]) -> bool:
self.graph = graph
self.visited = [0]*len(graph)
for i in range(len(graph)):
if not self.visited[i] and not self.dfs(i, 1):
return False
return True