Skip to content

Commit

Permalink
Update 785.is-graph-bipartite.md
Browse files Browse the repository at this point in the history
  • Loading branch information
azl397985856 authored Jul 12, 2021
1 parent eefcf52 commit 485719d
Showing 1 changed file with 52 additions and 5 deletions.
57 changes: 52 additions & 5 deletions problems/785.is-graph-bipartite.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,11 @@ graph[i] 不会包含 i 或者有重复的值。

- 暂无

## 思路
## 着色法 + DFS

求二分图有两种思路,一个是着色法,另外一个是并查集。

### 思路

和 886 思路一样。 我甚至**直接拿过来 dfs 函数一行代码没改就 AC 了**

Expand All @@ -68,12 +72,12 @@ graph[i] 不会包含 i 或者有重复的值。

强烈建议两道题一起练习一下。

## 关键点
### 关键点

- 图的建立和遍历
- colors 数组

## 代码
### 代码

```py
class Solution:
Expand Down Expand Up @@ -102,8 +106,10 @@ class Solution:

**复杂度分析**

- 时间复杂度:$O(N^2)$
- 空间复杂度:$O(N)$
令 v 和 e 为图中的顶点数和边数。

- 时间复杂度:$O(v+e)$
- 空间复杂度:$O(v+e)$


如上代码并不优雅,之所以这么写只是为了体现和 886 题一致性。一个更加优雅的方式是不建立 grid,而是利用题目给的 graph(邻接矩阵)。
Expand All @@ -123,6 +129,47 @@ class Solution:
if colors[i] == 0 and not dfs(i,1): return False
return True
```
## 并查集

### 思路

遍历图,对于每一个顶点 i,将其所有邻居进行合并,合并到同一个联通域中。这样当发现某个顶点 i 和其邻居已经在同一个联通分量的时候可以直接返回 false,否则返回 true。

### 代码

```py
class UF:
def __init__(self, n):
self.parent = {}
for i in range(n):
self.parent[i] = i
def union(self, i,j):
self.parent[self.find(i)] = self.find(j)
def find(self, i):
if i == self.parent[i]: return i
self.parent[i] = self.find(self.parent[i])
return self.parent[i]
def is_connected(self, i,j):
return self.find(i) == self.find(j)

class Solution:
def isBipartite(self, graph: List[List[int]]) -> bool:
n = len(graph)
uf = UF(n)
for i in range(n):
for neibor in graph[i]:
if uf.is_connected(i, neibor): return False
uf.union(graph[i][0], neibor)
return True
```


**复杂度分析**

令 v 和 e 为图中的顶点数和边数。

- 时间复杂度:$O(v+e)$
- 空间复杂度:$O(v+e)$

## 相关问题

Expand Down

0 comments on commit 485719d

Please sign in to comment.