二分圖的判斷 bfs+dfs兩種搜尋方法判斷
阿新 • • 發佈:2019-02-02
二分圖的定義是:給定一個具有n個頂點的圖,要給每個頂點上色,並且使相鄰的頂點顏色不相同。是否能用最多兩種顏色進行染色?
首先我們用鄰接矩陣來模擬圖,使用bfs對整個圖遍歷一遍
下面是使用鄰接表來模擬圖,然後使用dfs來搜尋整張圖:#include <iostream> #include <queue> #include <cstring> using namespace std; const int MAX_N = 105; int V, E; // 代表點的顏色,初始化為0,1或-1表示兩種不同的顏色 int color[MAX_N]; // 使用鄰接矩陣來模擬圖 int G[MAX_N][MAX_N]; bool bfs(int s) { color[s] = 1; queue<int> que; que.push(s); while(!que.empty()) { int from = que.front(); que.pop(); for(int i = 1; i <= V; i++) { // 如果相鄰的點沒有上色就給這個點上色 if(G[from][i] && color[i] == 0) { que.push(i); color[i] = -color[from]; } // 如果相鄰的顏色相同則返回false if(G[from][i] && color[i] == color[from]) return false; } } // 如果所有的點都被染過色,且相鄰的點顏色都不一樣,返回true return true; } int main() { // V代表有幾個點,E代表有幾條邊 cin >> V >> E; for(int i = 0; i < E; i++) { int s, t; cin >> s >> t; G[s][t] = G[t][s] = 1; } bool flag = false; // 初始化color陣列 memset(color, 0, sizeof(color)); for(int i = 1; i <= V; i++) { if(color[i] == 0 && !bfs(i)) { flag = true; break; } } if(flag) cout << "No" << endl; else cout << "Yes" << endl; return 0; }
// 一個簡單的二分圖的判斷 #include <iostream> #include <vector> #include <cstring> using namespace std; const int MAX_N =105; int V,E; // 使用鄰接表模擬一張無向圖 vector<int> G[MAX_N]; // 頂點的顏色,初始化為0,上色有兩種顏色(0 or 1) int color[MAX_N]; bool dfs(int v, int c) { color[v] = c; // 把頂點染成c for(int i = 0; i < G[v].size(); i++) { // 如果當前點的相鄰的點同色就返回false if(color[G[v][i]] == c) return false; // 如果當前點的鄰點還沒被染色,就染成-c if(color[G[v][i]] == 0 && !dfs(G[v][i], -c)) return false; } // 如果當前點都被染過色,就返回true return true; } void solve() { for(int i = 0; i < V; i++) { if(color[i] == 0) { if(!dfs(i,1)) { cout << "no" << endl; return; } } } cout << "yes" << endl; } int main() { cin >> V >> E; for(int i = 0; i < E; i++) { int s, t; cin >> s >> t; G[s].push_back(t); G[t].push_back(s); // 如果有向圖則無需這一句 } memset(color, 0, sizeof(color)); solve(); return 0; }