Java教程

算法学习(17):二分图判定

本文主要是介绍算法学习(17):二分图判定,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

二分图判定

怎么判定一个图是否为二分图
从其中一个定点开始,将跟它邻接的点染成与其不同的颜色,最后如果邻接的点有相同颜色,则说明不是二分图,每次用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();//进行判断
}
这篇关于算法学习(17):二分图判定的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!