二分图的判定
给定一个具有n个定点的图。要给图上每个顶点染色,并且要是相邻的顶点颜色不同,问是否能最多用两种颜色进行染色?题目保证没有重边和自环。
限制条件:
1<=n<=1000
vector<int> Adj[maxn]; //图
int n; //顶点数
int color[maxn]; //顶点的颜色 1|-1
//把顶点染成1或者-1
bool DFS(int v,int c)
{
color[v] = c; //把顶点v染成颜色c
for(int i=0;i<Adj[v].size();i++){
//如果相邻顶点同色,则返回false
if(color[Adj[v][i]] == c) return false;
//如果相邻顶点没有染色,则染成 -c
if(color[Adj[v][i]]==0&&!DFS(Adj[v][i],-c)) return false;
}
//如果所有顶点都染过色,就返回true
return true;
}
void solve()
{
for(int i=1;i<=n;i++){
if(color[i]==0){
//如果顶点i还没被染色,则染成 1
if(!DFS(i,1)){
printf("No\n");
return;
}
}
}
printf("Yes\n");
}