给定无向连通图G=(V, E)和m种不同的颜色,用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中相邻的两个顶点有不同的颜色?
图的m着色问题回溯算法的数据结构
#define NUM 100
int n; //图的顶点数量
int m; //可用颜色数量
int a[NUM][NUM]; //图的邻接矩阵
int x[NUM]; //当前的解向量
int sum ; //已经找到的可m着色的方案数量
回溯算法的实现
//形参t是回溯的深度,从1开始
void BackTrack(int t ){
int i;
//到达叶子结点,获得一个着色方案
if( t > n ) {
sum ++ ;
for(i=1; i<=n ;i++)
printf("%d ",x[i]);
printf("\n");
}
else //搜索当前扩展结点的m个孩子
for(i=1; i<=m; i++ ){//尝试每种颜色
x[t] = i;
if( Same(t) ) //判断t 和其邻接点的着色方法是否相同
BackTrack(t+1);
x[t] = 0;//回溯的需要,恢复到未着色的状态
}
}
检查相邻结点的着色是否一样的约束函数
//形参t是回溯的深度
bool Same(int t)
{
int i;
for(i=1; i<=n; i++ ) //检查t与所有顶点的邻接关系,包括染色和未染色的。
if( (a[t][i] == 1) && (x[i] == x[t]))
return false;
return true;
}