53
53
54
54
<!-- 这里可写通用的实现逻辑 -->
55
55
56
- 并查集。
56
+ ** 方法一:染色法判定二分图 **
57
57
58
- 并查集模板:
58
+ 遍历所有节点进行染色,比如初始为白色,DFS 对节点相邻的点染上另外一种颜色。如果要染色某节点时,要染的目标颜色和该节点的已经染过的颜色不同,则说明不能构成二分图。
59
+
60
+ ** 方法二:并查集**
61
+
62
+ 对于本题,如果是二分图,那么图中每个顶点的所有邻接点都应该属于同一集合,且不与顶点处于同一集合,因此我们可以使用并查集。遍历图中每个顶点,如果发现存在当前顶点与对应的邻接点处于同一个集合,说明不是二分图。否则将当前节点的邻接点相互进行合并。以下是并查集模板。
59
63
60
64
模板 1——朴素并查集:
61
65
@@ -114,14 +118,33 @@ p[find(a)] = find(b)
114
118
d[find(a)] = distance
115
119
```
116
120
117
- 对于本题,如果是二分图,那么图中每个顶点的所有邻接点都应该属于同一集合,且不与顶点处于同一集合,因此我们可以使用并查集。遍历图中每个顶点,如果发现存在当前顶点与对应的邻接点处于同一个集合,说明不是二分图。否则将当前节点的邻接点相互进行合并。
118
-
119
121
<!-- tabs:start -->
120
122
121
123
### ** Python3**
122
124
123
125
<!-- 这里可写当前语言的特殊实现逻辑 -->
124
126
127
+ ``` python
128
+ class Solution :
129
+ def isBipartite (self , graph : List[List[int ]]) -> bool :
130
+ def dfs (u , c ):
131
+ color[u] = c
132
+ for v in graph[u]:
133
+ if not color[v]:
134
+ if not dfs(v, 3 - c):
135
+ return False
136
+ elif color[v] == c:
137
+ return False
138
+ return True
139
+
140
+ n = len (graph)
141
+ color = [0 ] * n
142
+ for i in range (n):
143
+ if not color[i] and not dfs(i, 1 ):
144
+ return False
145
+ return True
146
+ ```
147
+
125
148
``` python
126
149
class Solution :
127
150
def isBipartite (self , graph : List[List[int ]]) -> bool :
@@ -130,8 +153,7 @@ class Solution:
130
153
p[x] = find(p[x])
131
154
return p[x]
132
155
133
- n = len (graph)
134
- p = list (range (n))
156
+ p = list (range (len (graph)))
135
157
for u, g in enumerate (graph):
136
158
for v in g:
137
159
if find(u) == find(v):
@@ -144,6 +166,39 @@ class Solution:
144
166
145
167
<!-- 这里可写当前语言的特殊实现逻辑 -->
146
168
169
+ ``` java
170
+ class Solution {
171
+ private int [] color;
172
+ private int [][] g;
173
+
174
+ public boolean isBipartite (int [][] graph ) {
175
+ int n = graph. length;
176
+ color = new int [n];
177
+ g = graph;
178
+ for (int i = 0 ; i < n; ++ i) {
179
+ if (color[i] == 0 && ! dfs(i, 1 )) {
180
+ return false ;
181
+ }
182
+ }
183
+ return true ;
184
+ }
185
+
186
+ private boolean dfs (int u , int c ) {
187
+ color[u] = c;
188
+ for (int v : g[u]) {
189
+ if (color[v] == 0 ) {
190
+ if (! dfs(v, 3 - c)) {
191
+ return false ;
192
+ }
193
+ } else if (color[v] == c) {
194
+ return false ;
195
+ }
196
+ }
197
+ return true ;
198
+ }
199
+ }
200
+ ```
201
+
147
202
``` java
148
203
class Solution {
149
204
private int [] p;
@@ -177,6 +232,33 @@ class Solution {
177
232
178
233
### ** C++**
179
234
235
+ ``` cpp
236
+ class Solution {
237
+ public:
238
+ bool isBipartite(vector<vector<int >>& graph) {
239
+ int n = graph.size();
240
+ vector<int > color(n);
241
+ for (int i = 0; i < n; ++i)
242
+ if (!color[ i] && !dfs(i, 1, color, graph))
243
+ return false;
244
+ return true;
245
+ }
246
+
247
+ bool dfs(int u, int c, vector<int>& color, vector<vector<int>>& g) {
248
+ color[u] = c;
249
+ for (int& v : g[u])
250
+ {
251
+ if (!color[v])
252
+ {
253
+ if (!dfs(v, 3 - c, color, g)) return false;
254
+ }
255
+ else if (color[v] == c) return false ;
256
+ }
257
+ return true ;
258
+ }
259
+ };
260
+ ```
261
+
180
262
``` cpp
181
263
class Solution {
182
264
public:
@@ -207,6 +289,33 @@ public:
207
289
208
290
### **Go**
209
291
292
+ ```go
293
+ func isBipartite(graph [][]int) bool {
294
+ n := len(graph)
295
+ color := make([]int, n)
296
+ var dfs func(u, c int) bool
297
+ dfs = func(u, c int) bool {
298
+ color[u] = c
299
+ for _, v := range graph[u] {
300
+ if color[v] == 0 {
301
+ if !dfs(v, 3-c) {
302
+ return false
303
+ }
304
+ } else if color[v] == c {
305
+ return false
306
+ }
307
+ }
308
+ return true
309
+ }
310
+ for i := range graph {
311
+ if color[i] == 0 && !dfs(i, 1) {
312
+ return false
313
+ }
314
+ }
315
+ return true
316
+ }
317
+ ```
318
+
210
319
``` go
211
320
func isBipartite (graph [][]int ) bool {
212
321
n := len (graph)
@@ -239,12 +348,11 @@ func isBipartite(graph [][]int) bool {
239
348
function isBipartite(graph : number [][]): boolean {
240
349
const n = graph .length ;
241
350
let valid = true ;
242
- let colors = new Array (n ).fill (0 );
243
351
// 0 未遍历, 1 红色标记, 2 绿色标记
244
-
352
+ let colors = new Array ( n ). fill ( 0 );
245
353
function dfs(idx : number , color : number , graph : number [][]) {
246
354
colors [idx ] = color ;
247
- const nextColor = color == 1 ? 2 : 1 ;
355
+ const nextColor = 3 - color ;
248
356
for (let j of graph [idx ]) {
249
357
if (! colors [j ]) {
250
358
dfs (j , nextColor , graph );
@@ -265,6 +373,31 @@ function isBipartite(graph: number[][]): boolean {
265
373
}
266
374
```
267
375
376
+ ``` ts
377
+ function isBipartite(graph : number [][]): boolean {
378
+ const n = graph .length ;
379
+ let p = new Array (n );
380
+ for (let i = 0 ; i < n ; ++ i ) {
381
+ p [i ] = i ;
382
+ }
383
+ function find(x ) {
384
+ if (p [x ] != x ) {
385
+ p [x ] = find (p [x ]);
386
+ }
387
+ return p [x ];
388
+ }
389
+ for (let u = 0 ; u < n ; ++ u ) {
390
+ for (let v of graph [u ]) {
391
+ if (find (u ) == find (v )) {
392
+ return false ;
393
+ }
394
+ p [find (v )] = find (graph [u ][0 ]);
395
+ }
396
+ }
397
+ return true ;
398
+ }
399
+ ```
400
+
268
401
### ** ...**
269
402
270
403
```
0 commit comments