著名的四色定理說到,「如果在平面上劃出一些鄰接的有限區域,那麼可以用四種顏色來給這些區域染色,使得每兩個鄰接區域染的顏色都不一樣」
另乙個通俗的說法是,「任意乙個無飛地的地圖都可以用四種顏色染色,使得沒有兩個相鄰國家染的顏色相同。」
定理的證明比較複雜,但可以確信:四種顏色是足夠染完平面圖,並且保證每兩個鄰接區域染的顏色都不一樣。
在我的研究工作中,需要實現乙個這樣的演算法,最初我用dfs實現,確信思路正確,也測試了幾組資料,然而在區域數較多的時候,由於堆疊深度過深,導致程式崩潰(我猜想是這個原因),所以後來嘗試用了非遞迴實現的方法。
影象處理中的四色標記問題可以定義為:
給定鄰接矩陣 adj[n][n],其中若第i個區域與第j個區域相鄰,則a[i][j]=1,否則a[i][j]=0,求四色標記該區域的一組解(注意:解空間可能達到4^n,故只求一組解)
/**************************************
* main function
* para:
* @adj: adjacent matrix
* @record: record the labeled results
* @num: the number of regions
* * ************************************
*/void fourcolorlabel(int ** adj, int * record, int
num)
if (k; // 染色有衝突,換新顏色
else // 當前染色ok
}if (n>4
) // 如果當前用的已經超出標記範圍(說明在已標記的情況下,目前區域無合適的顏色,必須回退)
}}
以上的複雜度其實不是很好估計,跟具體的圖有關,回退次數不多的情況下,很快就能完成所有染色,否則,需要更多的回退次數。
附上我之前用dfs染色的程式示例:
1 #include 23using
namespace
std;45
/**************************************6*
7* four color label8*
9* ************************************
*/10
11/*
*************************************
12* main function
13* para:
14* @adj: adjacent matrix
15* @record: record the labeled results
16* @cur: current index
17* @n: the number of regions18*
19* ************************************
*/20
void fourcolorlabel(int adj[7], int* record, int cur, int
n);21
22/*
*************************************
23* checkok
24* para:
25* @adj: adjacent matrix
26* @record: record the labeled results
27* @cur: current index
28* @clabel: the label of cur29*
30* check "color the cur region with clabel" is ok or not
31* ************************************
*/32
bool checkok(int adj[7], int *record, int cur, int
clabel);
3334
intmain()35,
54 ,
55 ,
56 ,
57 ,
58 ,
59 };
6061
62int record[7] = ;
6364 fourcolorlabel(adj, record, 0, 7
);65
66for(int i=0; i < 7; i++)
6770 cout <7172
return0;
73}74void fourcolorlabel(int adj[7], int* record, int cur, int
n)75
82int clabel=0;83
if(record[cur] != 0)84
94}95//
if 成功標記
96if(flag == 1)97
100//
else 不成功,返回上一步
101else
102105
}106
107108
int flag = 0
;109
for(clabel = 1; clabel <= 4; clabel++)
110117
}118
//if 成功標記
119if(flag == 1
)120
123//
else 不成功,返回上一步
124else
125128
129}
130131
bool checkok(int adj[7], int* record, int cur, int
clabel)
132141
}142
return
true
;143 }
驗證四色原理
問題描述 如圖所示,表示乙個地圖有6個地區,它對應著乙個6 6的鄰接矩陣 見輸出樣例 輸出一種合理的著色方案,要求任意兩個相鄰的地區都不能同色。輸入格式 第1行為n,表示地區個數,n 20。以下為n n的鄰接矩陣,a i j 0表示地區i與地區j不相鄰,a i j 1表示地區i與地區j相鄰。輸出格式...
四色建模法
領域建模有很多種方法,不同建模手段得到的模型可能也不盡相同。那麼如何保證建模的正確性呢?首先這個質疑本身有問題,從建模的目的來說,描畫問題並沒有什麼對錯之分,僅僅只是立場和角度的差別。如果是為了企業業務而進行建模,那麼這個問題應該變為 如何保證模型能夠支撐企業的運營?建模之前,我們需要知道企業業務系...
1116 四色問題
時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 description 給定n 小於等於8 個點的地圖,以及地圖上各點的相鄰關係,請輸出用4種顏色將地圖塗色的所有方案數 要求相鄰兩點不能塗成相同的顏色 資料中0代表不相鄰,1代表相鄰 輸入描述 input descripti...