将相邻顶点染成不同颜色的问题叫图着色问题,对图进行染色所需要的最小颜色数称为最小着色数,最小着色数是2的图称为二分图。
因为只用2种颜色,所以确定一个顶点的颜色之后相邻的点的颜色也可以确定了。所以任意选择一个顶点出发,进行dfs,确定所有顶点的颜色
#include<vector>
using namespace std;
static const int MAX = 10000;
vector<int> G[MAX]; //图
int V; //顶点数量
int color[MAX]; //每个点的颜色(1,-1)
//将顶点v染成颜色c,成功染色返回true,否则返回false
bool dfs(int v, int c)
{
color[v] = c;
for (int i = 0; i < G[v].size(); i++)
{
if (color[G[v][i]] == c)
return false; //相邻的点的颜色相同
if (color[G[v][i]] == 0 && !dfs(G[v][i], -c))
return false;
}
//所有点都染好颜色了
return true;
}
void solve()
{
for (int i = 0; i < V; i++)
if (color[i] == 0)
if (!dfs(i, 1)) //未染色
{
printf("No\n");
return;
}
printf("Yes\n");
}