二分图的判定

题目来自挑战程序设计竞赛P97

描述:给定一个具有n个顶点,要给图上的每个顶点染色,并且要求相邻的顶点的颜色不同,问 能否最多用2种颜色进行染色,题目保证没有重边和自环

#include 
#include 
#include 
#include 
#include 
#define MAX_V 2505
using namespace std;
vector G[MAX_V];
int V,E,c=1;
int color[MAX_V];
bool dfs(int v, int c)
{
	color[v]=c;//把顶点染色
	for(int i = 0; i < G[v].size(); i++)
	{
		//相邻顶点的同色 返回false
		if(color[G[v][i]] == c)
			return false;
		//如果相邻的顶点还没被染色,则染成-c
		if(color[G[v][i]] == 0 && !dfs(G[v][i],-c))
			return false;
	}
	return true;

}
int main()
{
	memset(color,0,sizeof(color));
	scanf("%d %d",&V,&E);
	int a,b;
	for(int i = 0;i < E;i++)
	{
		scanf("%d %d", &a, &b);
		G[a].push_back(b);
	}	
	for(int i = 0; i < V; i++)
	{
		if(color[i]==0)
		{
			if(!dfs(i,1))
			{
				printf("No\n");
			}
		}
	}
	printf("Yes\n");
	return 0;
}

上边的这个程序是有向图,如果是无向图的话,只需要在输入的时候加上:

G[b].push_back(a);


(发现紫书太难懂了,所以转移阵地)

你可能感兴趣的:(二分图的判定)