算法二分图的判定

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法二分图的判定相关的知识,希望对你有一定的参考价值。

二分图的判定

              给定一个具有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(){
    //输入
} 

 

 

 

以上是关于算法二分图的判定的主要内容,如果未能解决你的问题,请参考以下文章

图的搜索---二分图判定

hihocoder -1121-二分图的判定

Divide Groups 二分图的判定

图论 —— 二分图的判定及最大匹配

二分图判定(图的搜索)

二分图判定