1. 问题
图的m着色问题。给定无限连通图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<=n)表示顶点1的颜色x1,顶点2的颜色x2,…,顶点k的颜色xk。
3. 设计
bool check(int sum){
for(int i=1;i<=sum;i++){
if(f[i][sum]&&c[i]==c[sum]){
return false;
}
}
return true;
}
void dfs(int s){
if(s>n){
num++;
return;
}
for(int i=1;i<=m;i++){
c[s]=i;
if(check(s)){
dfs(s+1);
}
else {
c[s]=0;
}
}
}
4. 分析
5. 源码
kitalekita/图的m着色问题.cpp at main · kitalekita/kitalekita (github.com)