1. 程式人生 > >演算法 圖的M著色問題

演算法 圖的M著色問題

題目

給定無向連通圖和m種不同的顏色。用這些顏色為圖G的各頂點著色,每個頂點著一種顏色。是否有一種著色法使G中每條邊的兩個頂點有不同的顏色。這個問題是圖的m可著色判定問題。
若一個圖最少需要m種顏色才能使圖中每條邊相連線的兩個頂點著不同顏色,稱這個數m為這個圖的色數。
求一個圖的色數m稱為圖的m可著色優化問題。給定一個圖以及m種顏色,請計算出塗色方案數。

這裡寫圖片描述

分析

回溯法。塗的時候從顏色1開始到m,每當塗上一個色,判斷這個點是否可以塗這個色,不可以的話就不再往下塗了,換成另一個顏色,可以的話就繼續。

#include <stdio.h>    
#include <math.h>
#define n 5 #define m 4 //顏色數 int a[n+1][n+1]={ {0,0,0,0,0,0}, {0,0,1,1,1,0}, {0,1,0,1,1,1}, {0,1,1,0,1,0}, {0,1,1,1,0,1}, {0,0,1,0,1,0} }; int count=0;//方案數 int color[n+1]={0};//塗顏色陣列 bool ok(int x){ for(int i=1; i<=n; i++){ if(a[x][i]==1 && color[x]==color[i]){//不能為1,不重複
return false; } } return true; } void dfs(int t){ if(t>n){//有n個頂點的圖的著色樹是有n+1層 count++; }else{ for(int i=1; i<=m; i++){//塗個色 1~m color[t]=i; if(ok(t)){ dfs(t+1); } color[t]=0; } } } int
main(){ dfs(1);//從1開始 printf("%d\n",count); return 0; }