# UVA 10004 - Bicoloring
### 題意:
1976 年,著名的「四色地圖定理」在電腦協助下被證明。
該定理指出:任何地圖都能用四種顏色來上色,使得沒有相鄰地區使用相同的顏色。
目標:
判斷給定的任意連通圖是否可以雙色著色(bicolored)。
也就是,能否只用兩種顏色為圖中的節點上色,讓每對相鄰的節點都使用不同的顏色?
=> 判斷該圖能否讓==每對相鄰節點皆為不同顏色==。
你可以假設每張圖皆符合下列三點:
1. 沒有節點會與自己相連。
2. 為==無向圖==。
3. 為==連通圖==。(任意兩個節點之間,至少存在一條路徑可以連接)
### Sample Input:
輸入包含多筆測資。
每筆測資格式如下:
1. 第一行是一個整數 n,表示節點數量(1 < n < 200)。
2. 第二行是一個整數 l,表示邊的數量。
3. 接下來有 l 行,每行有兩個整數 a 和 b,代表節點 a 和節點 b 之間有一條邊。
節點編號為 0 到 n-1。
如果讀到 n = 0,表示輸入結束,這一行不需處理。
```=
3
3
0 1
1 2
2 0
3
2
0 1
1 2
9
8
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0
```
### Sample Output:
如果這張圖可以雙色著色,輸出 "BICOLORABLE."
否則輸出 "NOT BICOLORABLE."
```=
NOT BICOLORABLE.
BICOLORABLE.
BICOLORABLE.
```
### 程式碼:
**我的解法:**
如果沒有 cycle 的話,就是 bicolorable 的圖
如果有 cycle 的話,需要檢查 (去跑跑看DFS)
**小 tips:**
記得離散數學的話,判斷 cycle 的方式就很簡單了。
if 邊的數量 = 節點數量-1
就表示沒有 cycle,
大於等於表示有 cycle。
(這裡要注意: 是因為題目寫沒有自迴圈 + 為連通圖,再加上輸入的邊不會重複,才可以這樣解哦!)
btw. 就算沒判斷有沒有 cycle,直接全部丟 DFS 也會過。
```cpp=
#include <bits/stdc++.h>
using namespace std;
struct Node {
int color;
vector<int> nbs;
Node() : color(0), nbs() {}
};
bool DFS(map<int, Node>& g, int i, int nowc) {
g[i].color = nowc;
if (nowc == 1) nowc = 2;
else nowc = 1;
for (auto& nb : g[i].nbs) {
if (g[nb].color == 0) {
if (!DFS(g, nb, nowc)) return false;
}
else if (g[nb].color == g[i].color) return false;
}
return true;
}
int main() {
int n, e, t1, t2;
while (cin >> n && n) {
cin >> e;
map<int, Node> g;
for (int i = 0; i < e; i++) {
cin >> t1 >> t2;
g[t1].nbs.push_back(t2);
g[t2].nbs.push_back(t1);
}
if (e == n - 1) { // 這段沒有也可以過
cout << "BICOLORABLE." << endl;
continue;
}
if (DFS(g, 0, 1)) cout << "BICOLORABLE." << endl;
else cout << "NOT BICOLORABLE." << endl;
}
}
```