AcWing 860. 染色法判定二分图
#include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 100010, M = 200010; int n, m; int h[N], e[M], ne[M], idx; int color[N]; void add(int a, int b) { e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ; } bool dfs(int u, int c) { color[u] = c;//当前这个点的颜色为c for (int i = h[u]; i != -1; i = ne[i]) { int j = e[i]; if (!color[j]) {//如果没有被染色,那么就染色,1变成2,2变成1 if (!dfs(j, 3 - c)) return false; } else if (color[j] == c)//如果已经染过颜色,判断是否矛盾 return false; } return true; } int main() { scanf("%d%d", &n, &m); memset(h, -1, sizeof h); while (m -- ) { int a, b; scanf("%d%d", &a, &b); add(a, b), add(b, a);//无向图 } bool flag = true;//判断是否存在矛盾 for (int i = 1; i <= n; i ++ ) if (!color[i]) {//如果没用被染过颜色 if (!dfs(i, 1)) {//如果存在矛盾 flag = false; break; } } if (flag) puts("Yes"); else puts("No"); return 0; }