题目描述:
给定无向连通图和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的两个顶点有不同的颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边相连接的两个顶点着不同颜色,称这个数m为这个图的色数。求一个图的色数m称为图的m可着色优化问题。 给定一个图以及m种颜色,请计算出涂色方案数。
题目类型:回溯算法
代码如下:
#include<stdio.h>
#define m 5 //m个顶点
#define n 4 //n种颜色
int a[5][5]={
0,1,1,1,0,
1,0,1,1,1,
1,1,0,1,0,
1,1,1,0,1,
0,1,0,1,0};
int color[m]={0};//存储m个顶点的着色选择,可以选择的颜色为1到n
int count=0;
bool ok(int num)
{
int i;
for(i=0;i<num;i++) { //前num个与第num相邻的点中,不能有冲突的颜色
if(a[num][i]==1 && color[i]==color[num]) {
return false;
}
}
return true;
}
void traceback(int num)
{
int i;
if(num==m) {
count++;
for(i=0;i<m;i++)
printf("%d ",color[i]);
printf("\n");
return;
}
for(i=1;i<=n;i++) {
color[num]=i;
if(ok(num))
traceback(num+1);
//color[num]=0 每次只查找前num个顶点中是否有冲突颜色,所以无需再赋为0
}
}
int main()
{
int i,j;
traceback(0);
printf("%d\n",count);
return 0;
}