一、问题
问题描述:
图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个
顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方
案;如果不存在,则回答“NO”。
二、解析
首先,使用邻接矩阵存储无向连通图;其次,明确color数组代表的含义:color[n],大小为n,下标肯定代表顶点,里面的值代表这个顶点放的是哪种颜色。还要判断当前顶点和哪些顶点有着色冲突,若有return false;否则return true。将颜色初始化,遍历搜索下一个颜色。根据着色情况输出、处理下一个顶点或回溯。用flag记录下来是否可以着色,如果没有可以着色的方案,输出“NO”。
三、设计
bool OK(int k,int c[][100]){ //判断顶点k的着色是否发生冲突
int i;
for (i=1; i<k; i++)
if (c[k][i]==1 && color[i]==color[k])
return false;
return true;
}
void graphcolor(int n,int m,int c[][100]){
int i,k;
int flag=0;
for (i=1; i<=n; i++) {
color[i]=0; //初始化
}
k=1;
while (k>=1) {
color[k]=color[k]+1;
while (color[k]<=m) {
if(OK(k,c))
break;
else
color[k]=color[k]+1; //搜索下一个颜色
}
if (color[k]<=m&& k==n) { //输出
for (i=1; i<=n; i++) {
printf("%d ",color[i]);
}
printf("\n");
flag=1;
}
else if (color[k]<=m&&k<n){
k=k+1; //处理下一个顶点
}
else{
color[k]=0;
k=k-1; //回溯
}
}
if (flag==1) {
printf("NO\n");
}
}
四、分析
对于每一个内结点,在最坏情况下,用ok检查当前扩展结点的每一个儿子所相应的颜色可用性需耗时O(mn)。回溯法总的时间耗费是O(nm^n)。
源码在这
本文探讨了图的m着色问题,介绍了一种基于邻接矩阵存储和递归回溯算法的解决方案。通过定义color数组来表示各顶点的颜色,并设计OK函数判断顶点着色是否冲突,最终实现所有可能的着色方案输出。
1596

被折叠的 条评论
为什么被折叠?



