標籤:mystra 編程演算法 二分圖判定 代碼 c++
二分圖判定 代碼(C)
本文地址: http://blog.csdn.net/caroline_wendy
題目: 給定一個具有n個頂點的圖. 要給圖上每個頂點染色, 並且要使相鄰的頂點顏色不同.
是否能最多用2種顏色進行染色. 沒有重邊和閉環.
即二分圖問題.
使用深度優先搜尋(dfs), 把頂點染成c, 然後相鄰邊染成-c.
如果相鄰邊被染色過, 且相同, 則圖不是二分圖; 如果所有邊都被染色, 並且互不相同, 則是二分圖.
進行多次搜尋, 避免非連通圖.
代碼:
/* * CppPrimer.cpp * * Created on: 2014.7.27 * Author: Caroline *//*eclipse cdt*/#include <stdio.h>#include <vector>using namespace std;class Program {static const int MAX_V = 100;/*vector<int> G[MAX_V] = {{1,3}, {0,2}, {1,3}, {0,2}};int V = 4;*/vector<int> G[MAX_V] = {{1,2}, {0,2}, {0,1}};int V = 3;int color[MAX_V] = {0};bool dfs(int v, int c) {color[v] = c;for (size_t i=0; i<G[v].size(); ++i) {if (color[G[v][i]] == c) return false;if (color[G[v][i]] == 0 && !dfs(G[v][i], -c)) return false;}return true;}public:void solve() {for (int i=0; i<V; i++) {if (color[i] == 0) {if(!dfs(i,1)) {printf("result = No\n");return;}}}printf("result = Yes\n");}};int main (void){Program iP;iP.solve();return 0;}
輸出:
result = No