染色法判别二分图
作者:
ysc
,
2021-07-30 14:03:43
,
所有人可见
,
阅读 232
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e5+10, M = 2e5+10; //无向图,边的数目要存二倍
int h[N], e[M], ne[M], idx; //定义邻接表存储
int color[N];
int n, m;
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; //把当前点染色
for ( int i = h[u]; i != -1; i = ne[i] ) //遍历当前点能够到达的点
{
int j = e[i]; //取出能到达的点
if ( !color[j] ) //判断是否染色
{
if ( !dfs(j, 3 - c) ) return false; //没染色,dfs当前点
}
else if ( color[j] == c ) return false; //如果染色了并且和当前点颜色一样,不是二分图
}
return true;
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m;
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染色
{
flag = false; //不是二分图,记录一下
break;
}
}
if ( flag ) puts("Yes");
else puts("No");
return 0;
}
老哥要考研吗,好厉害,一直在刷题,我才刚来
嗯嗯,要考研,加油