導航:首頁 > 源碼編譯 > 圖的染色問題演算法

圖的染色問題演算法

發布時間:2022-11-12 14:26:19

① 「四色定理」在實際中有什麼應用

四色定理是圖的著色問題的一個結果。圖的著色本質是給圖中的頂點貼標簽(labeling),但是要滿足一定的條件。「色」只是一種標簽。

四色定理的描述雖然提到了地圖,但是地圖繪制並不需要四色定理:他只要著色,不需要用最少的顏色。實際畫地圖時一般不用四種顏色。

著色問題的應用,主要排程和分配問題上。
比如我有幾個任務,每個任務都需要一天。而我知道其中幾樣任務是沖突的,不能安排在同一天完成。現在我希望四天完成。這就是四色問題了:所用的圖以任務為頂點,沖突的任務間連邊,用日期做顏色,對圖著色。

再比如我有一些員工,我希望把他們分成四個小組。但是我知道其中幾個員工互相之間有矛盾,不能安排在同一組。那麼這又是四色問題:所用的圖以員工為頂點為,矛盾的員工間連邊,用組做顏色,對圖著色。

四色定理說:如果上面提到的圖是平面圖(有高效演算法判定),那麼可能四天完成/可能分成四組。

② 用4種不同的顏色給圖中的圓圈染色,有線段相連的兩個圓圈不能同色,一共有多少種不同的染色方法

4×3×3×2
=72(種)
答:一共有72種不同的染色方法.

③ 用c#編碼一個圖的m-著色問題

給出一個圖的m-著色的程序段,回溯法:
/* 圖的鄰接矩陣Graph[n,n]表示無向連通圖G,
1,2,3,..m代表不同的顏色
頂點i所著色用x[i]表示,初始值都賦為0
*/
void NextValue(int k)
{
int j, flag;
do{
x[k] = (x[k]+1) % (m + 1)//分配給x[k]一種新的顏色
if (x[k] == 0)
return; //x[k]的顏色已用完
flag = 1; //x[k]是否可用的標記
for (j = 0; j < n; j++)
if (Graph[k,j] == 1 && x[k] == x[j]){
flag = 0; //x[k]不可用
break;
}
while (flag);
}
void MColoring(int k)
{
while (x[k] < m){ //產生x[k]的合理分配
NextValue(k); //找x[k]的一個合理分配
if (x[k] == 0)
return; //無解,結束調用
if (k == n) { //著完n個頂點,找到完整著色法,輸出
Output(x,k) //輸出當前解
else
MColoring(k+1)
}
}

/*
遞歸演算法:
void Coloring(區域 n)
1. 令顏色集ClrSet={ 沒有被區域n的鄰居區域使用的顏色 }.
2. 如果ClrSet是空集,返回.
3. 對ClrSet中的每種顏色c,作循環:
3.1 為區域n著色c。
3.2 如果所有區域都已著色(n是最後一個區域),那麼顯示/保存著色結果.
3.3 否則對下一個尚未著色的區域(n+1),調用Coloring(n+1).
4. 把區域n變為沒有著色的區域.
--------------------------------------------------------
*/
template<int node_count = 8>
class CColoring
{
private:
typedef int node_type;
typedef int color_type;
typedef std::set<node_type> node_set;
typedef std::vector<color_type> color_array;

public:
void operator()(const int _Matrix[node_count][node_count])
{
matrix = _Matrix;

colors_of_nodes.resize(node_count, 0);

total_count = 0;

coloring(0);
}

private:
void coloring(node_type n)
{
// 顏色的使用情況
std::vector<bool> used_colors;

node_type m;
color_type c;

// 初始化顏色的使用情況
used_colors.resize(color_count, false);

// 遍歷每個與區域n相鄰的區域m
for(m = 0; m < node_count; ++m)
{
if(matrix[n][m])
{
// 獲取m的顏色
c = colors_of_nodes[m];
// m已著色
if(c != 0)
used_colors[c] = true;
}
}

// 遍歷每個未被n的鄰居使用的顏色c
for(c = 1; c < color_count; ++c)
{
if(!used_colors[c])
{
// 為n著色c
colors_of_nodes[n] = c;

// 著色完畢
if(n >= node_count - 1)
{
++total_count;

// 輸出結果
_tprintf(_T("---------------------\n"));
_tprintf(_T("Method %d:\n"), total_count);
for(m = 0; m < node_count; ++m)
{
_tprintf(_T("node: %d, color: %d\n"), m, colors_of_nodes[m]);
}
}
// 還有區域沒有著色
else
{
// 為下一個未著色的區域,調用coloring()
coloring(n + 1);
}
}
}

// 將n設置為沒有著色的區域
colors_of_nodes[n] = 0;
}

// 0表示無色,1-4表示4種不同顏色
static const int color_count = 5;
// 鄰接矩陣
const int (* matrix)[node_count];
// 各區域對應的顏色
color_array colors_of_nodes;
// 總的著色方案數
int total_count;
};

void main()
{
int Matrix[4][4] =
{
{ 0, 1, 0, 0 },
{ 1, 0, 0, 0 },
{ 0, 0, 0, 1 },
{ 0, 0, 1, 0 },
};

CColoring<4> coloring;
coloring(Matrix);
}

④ 數學染色問題

郭敦顒回答:

分三種類型進行研究——

當N=9≡0(mod3)時,

當N=10≡1(mod3)時,

當N =11≡2(mod3)時。

三種顏色分別為:A、B、C。

對於N=9≡0(mod3)時染色方式的排列組合的思路,如圖

(一)內環的染色方式是ABC循環式,是其它染色方式變化的出發點。

(二)中環內有兩種基本類型的染色方式,分別為位於分子和分母的位置

(1)位於分子位置的染色方式是1個A後接著是 BC循環式;

(2)位於分子位置的染色方式是1個A後接著是 BC循環式。

(三)外環內按排有4種變形類型的染色方式,將每一段按逆時針順序分為4區,每區排列一種染色方式

(1)一區是由BC循環式中的第1個C替換為A;

(2)二區是由CB循環式中的第1個B替換為A;

(3)三區是由BC循環式中的第2個C替換為A;

(4)四區是由CB循環式中的第2個B替換為A;

下面還會有3—6個C和B分別替換為A,

故當N 9時有N-3=9-3=6個C,和6個B被分別替換為A,

共有(3-1)(N-3)=2(N-3)=2N-6種。

(四)未繪圖,

(1)由BC循環式中的第1個和第3個共2個C,第1個和第5個共2個C,第3個和第5個共2個C,總計2×3=6種分別替換為A的染色方式。

(2)由CB循環式中的第1個和第3個共2個B,第1個和第5個共2個B,第3個和第5個共2個B,總計2×3=6種分別替換為A的染色方式。

上兩項共12種染色方式,

前面提供的是染色方式的排列組合的思路,當N=10≡1(mod3)

和當N =11≡2(mod3)時的排序方式略。




C

B C B C B C

B B B

C C/B B/C C

B B

C B/CA C C/B C

C B B A

B A

C/BC A B/C

C A C C

B B B

A A/A C/B B

A A B/C A C

A B BA

CC

⑤ 小學奧數題:用四種顏色對圖中的ABCDE五個區域染色,要求相鄰的區域染不同的顏色,有多少種不同的染色方法

由於C跟其他四個區域,都有相鄰,首先考慮C
C有4種選擇,
A要跟C不同,因此A有3種選擇,
D要跟C不同,此時分兩種情況:
(1)D和A同色,D有1種選擇,C又是另外1種顏色,此時已經出現兩種顏色,B和E都可以用剩下的兩種顏色(因為B、E不相鄰,可以同色)
(2)D和A不同色,D有2種選擇,C又是另外1種顏色,此時已經出現三種顏色,B和E都只能用剩下的一種顏色(此時B、E同色)
總計算式:4×3×1×2×2+4×3×2×1×1=72

PS:1樓直接把問題考慮簡單了,2樓在考慮如果b和e不一樣的時候,b和e可以顏色互換,有兩種情況,要再乘以2

⑥ 想問一些離散數學中染色多項式是什麼求具體

染色多項式(chromatic polynomial),其實是在圖論中的一個概念。
主要是為了解決著名的四色猜想,形成的一個概念。

具體數學史資料如下:

早在1912年,Birkhoff為解決四色猜想,提出了染色多項式(chromatic polynomial)[14-15]的概念。染色多項式的基本思想是:用給定的若干種顏色對給定的圖進行染色,有多少種染色方法?

圖G的染色多項式記為P(G, x),它表示用不超過x種顏色對圖染色的方法數。對於一個整數k,若P(G, k) = 0,則表示圖G不可能僅用k種顏色染色。染色多項式與頂點染色問題有著密切的關系,圖的色數(chromatic number)實際上是使得其染色多項式取非0值的最小正整數,因此如果求出了一個圖的的染色多項式,那麼圖的色數也容易求出來。

用染色多項式研究頂點染色問題的一個好處是:可以利用比較成熟的代數工具處理圖論問題。數學家們對染色多項式進行了大量的研究,並取得了不少研究成果,如著名的縮邊原理,利用此原理可求出一般圖的染色多項式,關於縮邊原理將在後面詳述。

另外,頂點染色問題是一個典型的NP−hard問題,現在與此相關的一個重大問題就是:P =? NP問題,多數數學家傾向於認為P ≠NP,但這個問題在理論上遠未得到解決[16-18]。從理論上完全解決頂點染色問題現在看來過於困難,到目前為止還沒有很好的解決NP−hard問題的方法。

盡管數學家已經取得了不少成果,但就本質而言,理論上並沒有什麼實質性的進展。由於工程及實際應用的需要,世界各地的數學家、工程師進行了大量有關頂點染色問題的演算法研究。如今,大量的近似演算法已經被提出來,而效率較高的精確求解演算法卻不多。

在近似演算法方面,最簡單的一種是顏色編號最小優先演算法,這種演算法每次選擇編號最小的可用顏色對一個點染色,然而這種演算法並不能給出精確解,甚至在多數情況下其近似解與精確解相差甚遠。此外,數學家利用現在流行的演算法工具如遺傳演算法、啟發式演算法、分布式演算法等研究頂點染色問題,提出了各式各樣的近似演算法。

如Brelaz提出了一種遺傳演算法,被稱作Brelaz Coloring,這種演算法可以給出一個很好的近似解。然而,上述所有近似演算法均不能得到精確解。在某些實際問題中,精度較高的近似解已經足夠應用了。這可能也就是大量的近似演算法被提出的原因。在精確演算法方面,進展不如近似演算法的研究。其中一種比較直觀的是所謂brute−force search演算法,這種演算法將已知的k種顏色分配給n個頂點,它需要對所有的kn種情況判斷是否可行,因而其演算法復雜度為O(kn)。

最近Malaguti等人提出了一種Branch and Price演算法[21],這種演算法在一種遺傳演算法的基礎上改進而得到,能解決的圖頂點數也限於幾百以內。在精確演算法復雜度方面,現在最好的結果也限於指數級。如k-可染色問題(k-colorability)的演算法復雜度為O(2nn),特別的k = 3或4時,目前最好的演算法其復雜度分別為O(1.3289n) 和O(1.7504n)。

⑦ 圖著色問題的路線著色問題

道路著色問題(Road Coloring Problem)是圖論中最著名的猜想之一。通俗的說,這個猜想認為,可以繪制一張「萬能地圖」,指導人們到達某一目的地,不管他們原來在什麼位置。這個猜想最近被以色列數學家艾夫拉漢· 特雷特曼(Avraham Trahtman)在2007年9月證明。
舉個例子。在維基網給出的圖例中,如果按圖中所示方式將16條邊著色,那麼不管你從哪裡出發,按照「藍紅紅藍紅紅藍紅紅」的路線走9步,你最後一定達到黃色頂點。路線著色定理就是說在滿足一定條件的有向圖中,這樣的著色方式一定存在。嚴格的數學描述如下。我們首先來定義同步著色。G是一個有限有向圖並且G的每個頂點的出度都是k。G的一個同步著色滿足以下兩個條件:1)G的每個頂點有且只有一條出邊被染成了1到k之間的某種顏色;2)G的每個頂點都對應一種走法,不管你從哪裡出發,按該走法走,最後都結束在該頂點。有向圖G存在同步著色的必要條件是G是強連通而且是非周期的。一個有向圖是非周期的是指該圖中包含的所有環的長度沒有大於1的公約數。路線著色定理這兩個條件(強連通和是非周期)也是充分的。也就是說,有向圖G存在同步著色當且僅當G是強連通而且是非周期的。
特雷特曼在數學上的這一成果極為令人矚目,英國《獨立報》為此事專門發表了一篇題為「身無分文的移民成了數學超級明星」的文章,給予了高度的評價。
以色列人也為特雷特曼取得的成就感到無比的驕傲。特拉維夫電視台中斷了正常的節目播放,以第一時間發布了這一重大消息,連中東其他國家的主流媒體也作了大篇幅的相關報道。
得知特雷特曼解決這一難題的消息後,多年從事路線著色問題研究的加拿大數學家喬爾·弗里德曼說,「路線著色問題的解決令數學共同體非常興奮。」讀過特雷特曼論文的中國數學家和語言學家周海中教授認為,特雷特曼的數學知識非常淵博,解題方法十分巧妙,這一謎題得到破解,無疑是數學史上的一個華彩樂章。 演算法描述:color[n]存儲n個頂點的著色方案,可以選擇的顏色為1到m。
當t=1時,對當前第t個頂點開始著色:若t>n,則已求得一個解,輸出著色方案即可。否則,依次對頂點t著色1-m, 若t與所有其它相鄰頂點無顏色沖突,則繼續為下一頂點著色;否則,回溯,測試下一顏色。 #include<stdio.h>intcolor[100];boolok(intk,intc[][100])//判斷頂點k的著色是否發生沖突{inti,j;for(i=1;i<k;i++){if(c[k][i]==1&&color[i]==color[k])returnfalse;}returntrue;}voidgraphcolor(intn,intm,intc[][100]){inti,k;for(i=1;i<=n;i++)color[i]=0;k=1;while(k>=1){color[k]=color[k]+1;while(color[k]<=m)if(ok(k,c))break;elsecolor[k]=color[k]+1;//搜索下一個顏色if(color[k]<=m&&k==n){for(i=1;i<=n;i++)printf(%d,color[i]);printf( );}elseif(color[k]<=m&&k<n)k=k+1;//處理下一個頂點else{color[k]=0;k=k-1;//回溯}}}voidmain(){inti,j,n,m;intc[100][100];//存儲n個頂點的無向圖的數組printf(輸入頂點數n和著色數m: );scanf(%d%d,&n,&m);printf(輸入無向圖的鄰接矩陣: );for(i=1;i<=n;i++)for(j=1;j<=n;j++)scanf(%d,&c[i][j]);printf(著色所有可能的解: );graphcolor(n,m,c);} 利用相交圖(interference graph)來表示程序變數的生命期是否相交,將寄存器分配給變數的問題,可以近似地看成是給相交圖著色:相交圖中,相交的節點不能著同一顏色;每一種顏色對應一個寄存器。Chaitin等人最早提出了基於圖著色的寄存器分配方法其著色思路採用了Kempe的著色方法,即,任意一個鄰居節點數目少於k的節點,都能夠被k著色。判斷一個圖是否能夠被k(k>=3)種顏色著色,即k著色問題,被Karp證明是一個NP-complete問題。
但是,寄存器分配不僅僅是圖著色的問題。當寄存器數目不足以分配某些變數時,就必須將這些變數溢出到內存中,該過程成為spill。最小化溢出代價的問題,也是一個NP-complete問題。如果簡化該問題——假設所有溢出代價相等,那麼最小化溢出代價的問題,等價於k著色問題,仍然是NP-complete問題。
此外,如果兩個變數的生命期僅僅因為出現在同一個拷貝指令中而相鄰,那麼,通過將這兩個變數分配到同一個寄存器,就可以消除該拷貝指令,成為coalescing。這個方向的努力在Chaitin的文章以後的1/4個世紀,成為推動寄存器分配的主要動力之一,涌現出了包括aggressive coalescing,conservative coalescing和optimistic coalescing。但是,將兩個變數分配到同一個寄存器,等價於將這兩個變數合並成同一個變數,生命期合並,因而會加劇相交圖的聚簇現象,降低相交圖的可著色性。Bouchez等人證明了目前的coalescing問題都是NP-complete的。
為了降低相交圖的聚簇現象,提高相交圖的可著色性,可以通過將變數拷貝給一個臨時變數,並將以後對該變數的使用替換成對該臨時變數的使用,從而將一個變數的生命期分解成兩個變數的生命期,稱為live range splitting。顯然,這是一個與coalescing的作用相反的過程。Bouchez等人考慮了該方法的復雜度。
此外,寄存器分配還需要考慮寄存器別名(aliasing)和預著色(pre-coloring)的問題。寄存器別名是指,在某些體系結構中,一個寄存器的賦值可能會影響到另外一個寄存器。比如,在x86中,對AX寄存器的賦值,會影響AL和AH寄存器。預著色是指,某些變數必須被分配到特定的寄存器。比如,許多體系結構會採用特定寄存器來傳遞函數參數。
George和Appel發展了Chaitin的演算法,更好地考慮了coalescing過程和賦值過程,以及各過程之間的迭代,在基於圖著色的寄存器分配方法中具有廣泛的影響。

⑧ 奧數…用紅、黃、藍三種顏色對下圖進行染色,要求相鄰兩塊區域顏色不相同,共有多少種染色方法

應該有6種,按ABCD的順序,有紅黃紅藍、紅黃紅黃、紅黃藍黃、紅藍黃藍、黃藍黃藍、紅藍紅藍。

⑨ 小學五年級奧數染色問題

樓上的答案值得商榷。至少我沒有看懂他在說什麼。

這應該算是五年級的奧數里較難的題了。記得當初小學時,染色問題一直比較弱。現在依然如此,以至於這兩題花了我較長的時間。

1、首先,說思路。既然題目已經告訴你要染色了,那其實就限制了思考范圍,從而降低了難度。題目中最關鍵的是你要看見「往右」或「往上」本質是一樣的,非常對稱。但是「往左下」就不一樣了。為什麼這么說?因為考慮一下最普通的黑白相隔的染色方案,「往右」或「往上」都能保證每走一步會經過不同顏色的方格,但是「往左下」則保證每走這樣一步都會經過相同顏色的方格。所以,他們是不同的。所以,從直覺上判斷這里應該是本題的關鍵所在。

那麼,怎麼利用這一性質呢?其實問題沒有那麼復雜,所以不需要考慮太多的方法(我一開始就因為在幾種不同的方案上徘徊導致了浪費時間)而只要直接考慮最普通的方案,即找一染色方案保證每走一步(不論是往右或往上或往左下)都會經過不同顏色的方格。

這樣,目標其實很清楚了。我們需要三色去染這8*8的方格。如圖。至於如何得到此圖的染色過程其實不難,只要考慮對角線必須保證不同的顏色,然後又需要三色,這樣依次「藍黑白」地去染每條對角線,然後對於不同的對角線只需要保證相鄰的對角線的染色正好錯開了一格即可。

然後,就有這樣的思考。出發點不算我們要經過63格,既然每步都會經過不同顏色的方格,而且從左上角的藍色格出發正好經過了藍黑白三色各21格(出發點的藍色不算)正好能夠走完,但是從左下角的黑色格出發會經過藍22格,黑20格,白21格,而且是走不完的。那麼這時自然地我們就會考慮如果能夠保證「每三步」(任意的)正好經過了藍黑白三色,那麼的確從左下角出發是到達不了的,因為如果能保證「每三步」都經過了藍黑白三色,那總共的63步就會保證經過藍黑白三色各21次,但是顯然從右下角出發經過的藍黑數不同。矛盾。另一方面,從左上角的確保證了經過藍黑白各21次,而且也的確能遍歷。

所以,我們就想到是否能夠保證「每三步」(任意的)正好經過了藍黑白三色(順序不一定)呢?答案是肯定的。原因從圖上觀察便知。要到達每一黑色格子唯一的方法是通過一白色的格子,而要到達任何的白色的格子只有通過藍色的格子,而要到達藍色的格子只有通過黑色的格子,這樣循環。所以任何的三步都經過正好三色。從而63步經過三色各21次。與要經過藍22格,黑20格,白21格矛盾,所以無法遍歷。

閱讀全文

與圖的染色問題演算法相關的資料

熱點內容
python正則表達式貪婪模式 瀏覽:646
愛國精神指的是什麼app 瀏覽:408
壽司解壓系列全集視頻 瀏覽:913
物體三維重建演算法 瀏覽:984
fuli直播app哪個好 瀏覽:918
租辦公室用什麼app 瀏覽:106
醫師定期考核刷題app哪個好 瀏覽:338
導出dmp文件命令 瀏覽:288
手機百度網盤怎麼解壓密碼文件 瀏覽:585
索引重新編譯 瀏覽:606
命令與征服4免cd補丁完美版 瀏覽:428
kotlin編譯為native 瀏覽:142
家用編譯機 瀏覽:550
電子加密貨幣最新政策 瀏覽:382
androidcanvas撤銷 瀏覽:272
安卓手機怎麼把圖標全部下移 瀏覽:187
飢荒被伺服器踢出怎麼進 瀏覽:173
c編譯器哪款好 瀏覽:732
快手寶哥發明什麼app 瀏覽:823
張艷玲編譯 瀏覽:68