@@ -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
7983class Solution :
@@ -102,8 +106,70 @@ class Solution:
102106
103107** 复杂度分析**
104108
105- - 时间复杂度:$O(N^2)$
106- - 空间复杂度:$O(N)$
109+ 令 v 和 e 为图中的顶点数和边数。
110+
111+ - 时间复杂度:$O(v+e)$
112+ - 空间复杂度:$O(v+e)$
113+
114+
115+ 如上代码并不优雅,之所以这么写只是为了体现和 886 题一致性。一个更加优雅的方式是不建立 grid,而是利用题目给的 graph(邻接矩阵)。
116+
117+ ``` py
118+ class Solution :
119+ def isBipartite (self , graph : List[List[int ]]) -> bool :
120+ n = len (graph)
121+ colors = [0 ] * n
122+ def dfs (i , color ):
123+ colors[i] = color
124+ for neibor in graph[i]:
125+ if colors[neibor] == color: return False
126+ if colors[neibor] == 0 and not dfs(neibor,- 1 * color): return False
127+ return True
128+ for i in range (n):
129+ if colors[i] == 0 and not dfs(i,1 ): return False
130+ return True
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)$
107173
108174## 相关问题
109175
0 commit comments