概念:
当且仅当图中没有奇数环(奇数环:环,环的边是奇数)
二分图:不存在奇数环(奇数环:环且边为奇数) 二分图一定没有奇数环 证明方法--染色法
1—白
2—黑
实现方式--深广搜
下面是深搜模板:
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1e5 + 10;
int h[N], e[2 * N], ne[2 * N], idx;
int n, m;
int color[N];
void add(int x, int y)
{
e[idx] = y; ne[idx] = h[x]; h[x] = idx++;
}
bool dfs(int u, int c)
{
color[u] = c;//染色
for (int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if (!color[j])//未被染色
{
if (!dfs(j, 3 - c))return false;
}
else if (color[j] == c)return false;//有环,判定是j的颜色和他相邻点的颜色是否相等 , 相等则该环为奇数环, 该图为非二分图
}
return true;
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof h);
for (int i = 0; i < m; i++)
{
int x, y;
cin >> x >> y;
//无向图
add(x, y);
add(y, x);
}
bool flag = false;
for (int i = 1; i <= n; i++)
{
if (!color[i])
{
if (!dfs(i, 1))
{
flag = true;
break;
}
}
}
if (flag)cout << "No";
else cout << "Yes";
return 0;
}