【算法】二分图的判定
生活随笔
收集整理的這篇文章主要介紹了
【算法】二分图的判定
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
二分圖的判定
給定一個具有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(){//輸入 }總結
以上是生活随笔為你收集整理的【算法】二分图的判定的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【模板】堆的结构
- 下一篇: 【算法】Bellman-Ford算法(单