二分图判定
进阶二分图判定是图论基础,染色法是标准解法。
// 算法讲解
二分图判定
演示用 BFS 染色法判定二分图的过程。
待机
速度 中
待机 ⌨1bool isBipartite(int V, vector<vector<int>>& adj) {
2 vector<int> color(V, -1);
3 for (int i = 0; i < V; i++) {
4 if (color[i] != -1) continue;
5 color[i] = 0;
6 queue<int> q;
7 q.push(i);
8 while (!q.empty()) {
9 int u = q.front(); q.pop();
10 for (int v : adj[u]) {
11 if (color[v] == -1) {
12 color[v] = 1 - color[u];
13 q.push(v);
14 } else if (color[v] == color[u])
15 return false;
16 }
17 }
18 }
19 return true;
20}
复杂度分析
时间 O(V + E)
空间 O(V)
最优 O(V + E)
最坏 O(V + E)
算法讲解
二分图可以将顶点分成两组,使得每条边连接不同组的顶点。
BFS 染色法:从任意未染色顶点开始,交替染红蓝色。
如果发现相邻顶点颜色相同,则不是二分图。
时间复杂度 O(V+E),空间复杂度 O(V)。