圖着色算法描述:
https://www.jianshu.com/p/6a52b390f5fa
給定無向連通圖和m種不同的顏色。用這些顏色為圖G的各頂點着色,每個頂點着一種顏色。是否有一種着色法使G中每條邊的兩個頂點有不同的顏色。
這個問題是圖的m可着色判定問題。若一個圖最少需要m種顏色才能使圖中每條邊相連接的兩個頂點着不同顏色,稱這個數m為這個圖的色數。
求一個圖的色數m稱為圖的m可着色優化問題。 給定一個圖以及m種顏色,請計算出塗色方案數。
分析:
細致分析后,t代表頂點還是能分析出來的。
使用到了鄰接矩陣
還有就是color數組,也是解題的關鍵,要明確color數組代表的含義:color[n],大小為n,下標肯定代表頂點,里面的值代表這個頂點放的是哪種顏色。
Traceback(t)的t代表某一個頂點,這個頂點具體放哪種顏色不知道,肯定有個for循環從第一種顏色到最后一種顏色都要試一下,那么color[t]里就放當前這種顏色。OK(t)判斷一下,如果可以,traceback(t+1)。
OK(t)中,t頂點和哪些頂點有聯系,我就去判斷這些點放置的顏色有沒有和我相同,若有相同的,return false;否則,return true。
#include<stdio.h>
#include<iostream>
#define V 4//圖中的頂點數
/* 打印解決方案的實用函數 */
void printSolution(int color[])
{
printf(" Following are the assigned colors \n");
for (int i = 0; i < V; i++)
printf(" %d ", color[i]);
printf("\n");
}
bool isSafe(int v, bool graph[V][V], int color[], int c)////用於檢查當前顏色分配的實用程序函數
{
for (int i = 0; i < V; i++)
if (graph[v][i] && c == color[i])
return false;
return true;
}
void graphColoring(bool graph[V][V], int m, int color[], int v)//求解m着色問題的遞推效用函數
{
if (v == V)//基本情況:如果所有頂點都指定了顏色,則返回真
{
printSolution(color);
return;
}
/* 考慮這個頂點v並嘗試不同的顏色*/
for (int c = 1; c <= m; c++)
{
/* 檢查顏色C到V的分配是否正確*/
if (isSafe(v, graph, color, c))
{
color[v] = c;
/* 遞歸為其余頂點指定顏色 */
graphColoring(graph, m, color, v + 1);
/* 如果指定顏色C不會導致解決方案然后刪除它 */
color[v] = 0;
}
}
}
// driver program to test above function
int main()
{
/* Create following graph and test whether it is 3 colorable
(3)---(2)
| / |
| / |
| / |
(0)---(1)
*/
bool graph[V][V] = { { 0, 1, 1, 1 },
{ 1, 0, 1, 0 },
{ 1, 1, 0, 1 },
{ 1, 0, 1, 0 },
};
int m = 3; // Number of colors
int color[V];
for (int i = 0; i < V; i++)
color[i] = 0;
graphColoring(graph, m, color, 0);
system("pause");
return 0;
}
運行結果:

