【算法】二分图的判定

二分图的判定

              给定一个具有n个顶点的图。要给图上每个顶点染色,并且要使相邻的顶点颜色不同。

              判断是否能最多用两种颜色进行染色。题目保证没有重边和自环。

 

 

概念:把相邻顶点染成不同颜色的问题叫做图的着色问题。对图进行染色所需要的最小颜色数称为最小着色度。

    最小着色度为2的图称作二分图。

 

 

分析:如果只用两种颜色,那么确定一个顶点的颜色之后,和它相邻的顶点的颜色也就确定了。

    因此,选择任意一个顶点出发,依次确定相邻顶点的颜色,就可以判断是否可以被2种颜色染色了。

    这个问题用深度优先搜索可以简单实现。

 

#include <bits\stdc++.h>
using namespace std;
#define MAX_V 1000

//输入 
vector<int> G[MAX_V];  //
int V;                       //顶点数 
int color[MAX_V];  //顶点的颜色 (1 or -1) 


//顶点v,颜色c 
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;
        //如果相邻顶点没有被染色,染成-c,看相邻顶点是否满足要求 
        if(color[G[v][i]] == 0 && !dfs(G[v][i],-c)) return false;
    }
    //如果都没问题,说明当前顶点能访问到的顶点可以形成二分图 
    return true;
}


void solve(){
    //可能是不连通图,所以每个顶点都要dfs一次 
    for(int i = 0;i < V; i++){
        if(color[i] == 0){
            //第一个点颜色为 1 
            if(!dfs(i,1)){
                cout << "No" << endl;
                return;
            }
        }
    }
}


int main(){
    //输入
} 

 

 

 

posted @ 2017-10-22 17:24  ninding  阅读(4235)  评论(0编辑  收藏  举报