二分图判定
给定一个具有n个顶点的图.要给图上每个顶点染色,并且要使相邻的顶点颜色不同.问是否能最多用两种颜色进行染色? 题目保证没有重边和自环.
代码:
#include<iostream>
using namespace std;
int g[1000][1000]; //图
int v; //顶点数
int color[1000]; //顶点i的颜色(1 or -1)
//把顶点染成 1 或 -1
bool dfs(int v, int c)
{
color[v] = c; //把顶点v染成颜色c
for (int i = 1; i <= g[i][0]; i++)
{
//如果相邻的顶点同色, 则返回false
if (color[g[v][i]] == c) return false;
//如果相邻的顶点还没被染色,则染成-c
if (color[g[v][i]] == 0 && dfs(g[v][i], -c) == false) return false;
}
//如果所有顶点都染过色了,则返回true
return true;
}
int main()
{
cin >> v;
for (int i = 1; i <= v; i++)
{
cin >> g[i][0];
for (int j = 1; j <= g[i][0]; j++)
cin >> g[i][j];
}
for (int i = 1; i <= v; i++)
{
if (color[i] == 0)
{
//如果顶点还没有染色,则染成 1
if ( !dfs(i,1) )
{
cout << "NO" << endl;
return 0;
}
}
}
cout << "YES" << endl;
return 0;
}