怎么判定一个图是否为二分图
从其中一个定点开始,将跟它邻接的点染成与其不同的颜色,最后如果邻接的点有相同颜色,则说明不是二分图,每次用bfs遍历即可。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1005;
int color[maxn];//记录节点颜色
int link[maxn][maxn];//记录连通
int n,m;//点数,边数
int dfs(int x,int c){//对x节点进行c染色 ,并向下搜索是否可行
color[x]=c;
for(int i=1;i<=n;i++){
if(link[x][i]){//判断是否相连
if(color[i]==c){//如果已经染色,并且颜色一样,失败,返回0
return 0;
}
if(!color[i]) {//如果没有染色
if(!dfs(i,-c)) {//向下染色,颜色与原来相反,失败返回0
return 0;
}
}
}
}
//染色成功
return 1;
}
void judge() {//判断是否为二分图
for(int i=1;i<=n;i++) {
if(!color[i]) {//如果没有染色,就进行染色
if(!dfs(i,1)) {
printf("NO\n");//如果染色失败 输出no
return;
}
}
}
printf("YES\n");//正常遍历结束,输出yes
}
int main() {
scanf("%d %d",&n,&m);
int x,y;
for(int i=0;i<m;i++) {
scanf("%d %d",&x,&y);
link[x][y]=1;
link[y][x]=1;
}
judge();//进行判断
}