Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 485719d

Browse files
Update 785.is-graph-bipartite.md
1 parent eefcf52 commit 485719d

File tree

1 file changed

+52
-5
lines changed

1 file changed

+52
-5
lines changed

‎problems/785.is-graph-bipartite.md

Lines changed: 52 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,11 @@ graph[i] 不会包含 i 或者有重复的值。
4949

5050
- 暂无
5151

52-
## 思路
52+
## 着色法 + DFS
53+
54+
求二分图有两种思路,一个是着色法,另外一个是并查集。
55+
56+
### 思路
5357

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

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

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

71-
## 关键点
75+
### 关键点
7276

7377
- 图的建立和遍历
7478
- colors 数组
7579

76-
## 代码
80+
### 代码
7781

7882
```py
7983
class Solution:
@@ -102,8 +106,10 @@ class Solution:
102106

103107
**复杂度分析**
104108

105-
- 时间复杂度:$O(N^2)$
106-
- 空间复杂度:$O(N)$
109+
令 v 和 e 为图中的顶点数和边数。
110+
111+
- 时间复杂度:$O(v+e)$
112+
- 空间复杂度:$O(v+e)$
107113

108114

109115
如上代码并不优雅,之所以这么写只是为了体现和 886 题一致性。一个更加优雅的方式是不建立 grid,而是利用题目给的 graph(邻接矩阵)。
@@ -123,6 +129,47 @@ class Solution:
123129
if colors[i] == 0 and not dfs(i,1): return False
124130
return True
125131
```
132+
## 并查集
133+
134+
### 思路
135+
136+
遍历图,对于每一个顶点 i,将其所有邻居进行合并,合并到同一个联通域中。这样当发现某个顶点 i 和其邻居已经在同一个联通分量的时候可以直接返回 false,否则返回 true。
137+
138+
### 代码
139+
140+
```py
141+
class UF:
142+
def __init__(self, n):
143+
self.parent = {}
144+
for i in range(n):
145+
self.parent[i] = i
146+
def union(self, i,j):
147+
self.parent[self.find(i)] = self.find(j)
148+
def find(self, i):
149+
if i == self.parent[i]: return i
150+
self.parent[i] = self.find(self.parent[i])
151+
return self.parent[i]
152+
def is_connected(self, i,j):
153+
return self.find(i) == self.find(j)
154+
155+
class Solution:
156+
def isBipartite(self, graph: List[List[int]]) -> bool:
157+
n = len(graph)
158+
uf = UF(n)
159+
for i in range(n):
160+
for neibor in graph[i]:
161+
if uf.is_connected(i, neibor): return False
162+
uf.union(graph[i][0], neibor)
163+
return True
164+
```
165+
166+
167+
**复杂度分析**
168+
169+
令 v 和 e 为图中的顶点数和边数。
170+
171+
- 时间复杂度:$O(v+e)$
172+
- 空间复杂度:$O(v+e)$
126173

127174
## 相关问题
128175

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /