-
问题
图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。 -
解析
使用回溯算法来解决问题。
设G有n个顶点,将顶点编号为1, 2, … n,则搜索空间为深度n的m叉完全树,将颜色编号为1,2, .,m,结点
<x1,x2…,xk >(x1,x2…,xk∈{1,…,m},1≤k≤m)表示顶点1的颜色x1,顶点2的颜色x2,…,顶点k的颜色xk
-
设计
void traceback(int t) {
if (t > n) //n个点都已经走完
{
sum++;
for (int i = 1; i <= n; ++i)
printf("%d ", color[i]);
printf("\n");
}
else {
for (int i = 1; i <= m; ++i) {
color[t] = i;
if (ok(t)) {
traceback(t + 1);
}
color[t] = 0;
}
}
}
-
分析