图论---染色法(判断是否为二分图)
O(n+m)
二分图:可以把所有的点划分到两边,使得边只在集合之间,集合内部没有边。
二分图当且仅当图中不含奇数环(边数为奇数条)
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;const int N = 100010;
int n, m;
vector<int> g[N]; // 邻接表存图
int color[N];bool dfs(int u, int c) {color[u] = c;for (int j : g[u]) { // 遍历所有邻接点if (!color[j]) {if (!dfs(j, 3 - c)) return false;}else if (color[j] == c) return false;}return true;
}int main() {cin >> n >> m;while (m--) {int a, b;cin >> a >> b;g[a].push_back(b);g[b].push_back(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;
}