二分图判定

进阶

二分图判定是图论基础,染色法是标准解法。

二分图判定

演示用 BFS 染色法判定二分图的过程。

AlgoAnim · 二分图判定

待机

速度
待机
// 源代码
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)。