二分图
图中没有奇圈,那么该图是一个二分图。
判断一个图是不是二分图,只需要判断图中是否存在一个奇圈即可。
DFS染色判断二分图
原理很简单,就是采用DFS+染色的方式,如果发现相邻的两个点的颜色一样,那么我们返回改图不是二分图,否则返回是二分图。
例题
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
const int M=200010;
int edge[M];
int nest[M];
int last[N];
int val[M];
int cnt=2;
void add(int u,int v,int w){
edge[cnt]=v;
nest[cnt]=last[u];
last[u]=cnt;
val[cnt]=w;
cnt++;
return;
}
//二分图染色判断奇圈
int vise[N];
int mid;
bool dfs(int k,int color){
vise[k]=color;
for(int i=last[k];i;i=nest[i]){
//边权剪枝
if(val[i]<mid)continue;
if(!vise[edge[i]]){
if(!dfs(edge[i],