【算法】二分圖的判定


二分圖的判定

              給定一個具有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(){
    //輸入
} 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM