zoukankan      html  css  js  c++  java
  • 【算法】二分图的判定

    二分图的判定

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

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

     

     

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

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

     

     

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

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

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

     

    #include <bitsstdc++.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(){
        //输入
    } 

     

     

  • 相关阅读:
    Oracle使用序列创建自增字段(主键自动增长)
    Oracle 增加修改删除字段
    JavaScript trim函数大赏
    js跨域问题
    document.getElementsByClassName的理想实现
    IIS启用Gzip的方法与优缺点分析
    浅释跳转漏洞
    js跨域及解决方法
    C#编写COM组件
    50种方法巧妙优化你的SQL Server数据库
  • 原文地址:https://www.cnblogs.com/zhangjiuding/p/7710811.html
Copyright © 2011-2022 走看看