前言
二分图:把无向图分成两个集合V1和V2,所有的边都在V1和V2之间,而V1或V2的内部没有边。无向图是二分图当且仅当图中不含奇数环。
一、题目陈述
二、解决思路
利用结论:无向图是二分图当且仅当图中不含奇数环,进行染色判定。
三、代码实现
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+10,M=2*N;
int n,m;
int h[N],e[M],ne[M],idx;
void add(int a,int b) {
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int color[N];
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;
}
return true;
}
int main() {
cin>>n>>m;
memset(h,-1,sizeof h);
for(int i=0;i<m;i++) {
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)) {
flag=false;
break;
}
}
}
if(flag) puts("Yes");
else puts("No");
return 0;
}
总结
染色法判定无向图是否为二分图,关键在于奇数环定理。