Leetcode 785.判斷二分圖(Is Graph Bipartite?)

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章