圖着色算法描述:
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; }
運行結果: