四色標記演算法

2022-03-28 11:39:57 字數 3207 閱讀 7814

著名的四色定理說到,「如果在平面上劃出一些鄰接的有限區域,那麼可以用四種顏色來給這些區域染色,使得每兩個鄰接區域染的顏色都不一樣」

另乙個通俗的說法是,「任意乙個無飛地的地圖都可以用四種顏色染色,使得沒有兩個相鄰國家染的顏色相同。」

定理的證明比較複雜,但可以確信:四種顏色是足夠染完平面圖,並且保證每兩個鄰接區域染的顏色都不一樣。

在我的研究工作中,需要實現乙個這樣的演算法,最初我用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 2

3using

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...