二分图:一定不含有奇数环,可能包含长度为偶数的环, 不一定是连通图
/*
for i:1~n
if i未染色
dfs(i, 1);
*/
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010, M = N * 2;
int n, m;
int h[N], e[M], ne[M], idx;//邻接表
int color[N];//0代表未染色,1代表染了1号颜色,2代表染了2号颜色
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
//返回是否可以成功将u染色为c
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] && !dfs(j, 3 - c)) return false; //邻接点没染色 若相邻点不能染成相反色,那么当前点也算失败了
else if (color[j] == c) return false; // 若相邻点已经染色,而且还是和当前点打算染的一样,那么当前点也算失败了
}
return true;//没有失败,那么就是成功了
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof h);
while (m -- )
{
int a, b;
cin >> 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))//如果dfs返回false 说明出现矛盾
{
flag = false;
break;
}
}
if (flag) puts("Yes");
else puts("No");
return 0;
}