1. 程式人生 > >【算法】二分圖的判定

【算法】二分圖的判定

pre 滿足 二分 log 判斷 ext 連通圖 size ret

二分圖的判定

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

【算法】二分圖的判定