1.问题
给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。
2解析
使用回溯算法来解决问题。
设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
2.设计
```cpp
//判断是否能着色
bool cancColoring(int x) {
for (int i = 1; i <= n; ++i) {
//若两点相邻且颜色相同
if (graph[i][i] && color[i] == color[i]) {
return false;
}
}
return true;
}
//着色
void coloring(int x){
if (x>n) {
for (int i = 1; i <= n; i++){
printf("%d ", color[i]);
}
s++;
printf("\n");
}
else {
for (int i = 1; i <= m; ++i) {
color[x] = i;
if (cancColoring(x)) {
coloring(x+1);
}
color[x] = 0;
}
}
}
、
3.分析
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210606111217284.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NzM5NjEy,size_16,color_FFFFFF,t_70)
4.源码
https://github.com/695950719/Algorithm-design/blob/main/%E7%9D%80%E8%89%B2%E9%97%AE%E9%A2%98.cpp