圖着色算法描述:ios
https://www.jianshu.com/p/6a52b390f5fac++
給定無向連通圖和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; }
運行結果:spa