给定无向连通图和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的两个顶点有不同的颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边相连接的两个顶点着不同颜色,称这个数m为这个图的色数。求一个图的色数m称为图的m可着色优化问题。 给定一个图以及m种颜色,请计算出涂色方案数。
#include<stdio.h>
#define n 5 //图的区域数量
#define m 4 //颜色的数量
int count=0;
int color[n+1]={0};
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}
};
//判断是否符合条件,如果两块区域相邻,并且他们的颜色一样,返回false;否则,返回true
bool ok(int x){
for(int i=1; i<=n; i++){
if(a[x][i]==1 && color[x]==color[i])
return false;
}
return true;
}
//进行回溯
void traceback(int t)
{
if(t==n+1){ //总共有n+1层,当t走到最后一层时,count++
count++;
}
else{ //对每个区域进行着色并进行判断
for(int i=1; i<=m; i++){
color[t]=i;
if(ok(t))
traceback(t+1);
color[t]=0;
}
}
}
int main()
{
traceback(1);
printf("%d\n",count);
return 0;
}