File tree 1 file changed +52
-5
lines changed
1 file changed +52
-5
lines changed Original file line number Diff line number Diff line change @@ -49,7 +49,11 @@ graph[i] 不会包含 i 或者有重复的值。
49
49
50
50
- 暂无
51
51
52
- ## 思路
52
+ ## 着色法 + DFS
53
+
54
+ 求二分图有两种思路,一个是着色法,另外一个是并查集。
55
+
56
+ ### 思路
53
57
54
58
和 886 思路一样。 我甚至** 直接拿过来 dfs 函数一行代码没改就 AC 了** 。
55
59
@@ -68,12 +72,12 @@ graph[i] 不会包含 i 或者有重复的值。
68
72
69
73
强烈建议两道题一起练习一下。
70
74
71
- ## 关键点
75
+ ### 关键点
72
76
73
77
- 图的建立和遍历
74
78
- colors 数组
75
79
76
- ## 代码
80
+ ### 代码
77
81
78
82
``` py
79
83
class Solution :
@@ -102,8 +106,10 @@ class Solution:
102
106
103
107
** 复杂度分析**
104
108
105
- - 时间复杂度:$O(N^2)$
106
- - 空间复杂度:$O(N)$
109
+ 令 v 和 e 为图中的顶点数和边数。
110
+
111
+ - 时间复杂度:$O(v+e)$
112
+ - 空间复杂度:$O(v+e)$
107
113
108
114
109
115
如上代码并不优雅,之所以这么写只是为了体现和 886 题一致性。一个更加优雅的方式是不建立 grid,而是利用题目给的 graph(邻接矩阵)。
@@ -123,6 +129,47 @@ class Solution:
123
129
if colors[i] == 0 and not dfs(i,1 ): return False
124
130
return True
125
131
```
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)$
126
173
127
174
## 相关问题
128
175
You can’t perform that action at this time.
0 commit comments