染色法判定二分图
860. 染色法判定二分图
给定一个 \(n\) 个点 \(m\) 条边的无向图,图中可能存在重边和自环。
请你判断这个图是否是二分图。
输入格式
第一行包含两个整数 \(n\) 和 \(m\)。
接下来 \(m\) 行,每行包含两个整数 \(u\) 和 \(v\),表示点 \(u\) 和点 \(v\) 之间存在一条边。
输出格式
如果给定图是二分图,则输出 Yes
,否则输出 No
。
数据范围
\(1≤n,m≤10^5\)
输入样例:
4 4
1 3
1 4
2 3
2 4
输出样例:
Yes
结论:一个图是二分图当且仅当该图不含奇数环
- 时间复杂度:\(O(n+m)\)
代码
#include
using namespace std;
const int N=1e5+5;
int n,m,color[N];
vector adj[N];
bool dfs(int x,int c)
{
color[x]=c;
for(int y:adj[x])
{
if(!color[y])
{
if(!dfs(y,3-c))return false;
}
else if(color[y]==c)return false;
}
return true;
}
int main()
{
scanf("%d%d",&n,&m);
while(m--)
{
int x,y;
scanf("%d%d",&x,&y);
adj[x].push_back(y),adj[y].push_back(x);
}
bool f=true;
for(int i=1;i<=n;i++)
if(!color[i])
if(!dfs(i,1))
{
f=false;
break;
}
puts(f?"Yes":"No");
return 0;
}