演算法 圖的M著色問題
阿新 • • 發佈:2019-01-10
題目
給定無向連通圖和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;
}