图的着色问题
1、问题
图的m着色问题。给定无向连通图G和m种颜色,用这些颜色给图的顶点着色,每个顶点一种颜色。如果要求G的每条边的两个顶点着不同颜色。给出所有可能的着色方案;如果不存在,则回答“NO”。
2、解析
在填写每一个顶点的颜色时检查与相邻已填顶点的颜色是否相同。如果不同,则填上;如果相同(冲突),则另选一种;如果已没有颜色可供选择,则回溯到上一顶点。重复这一过程,直到所有顶点的颜色都已填上。
决策树如下:
3、设计
1 void GraphColor(int step) 2 if step==n+1 3 for i <- 1 to n 4 printf("%d ",color[i]) 5 count<-count+1 6 return 7 else 8 for i=1 to m 9 color[step]=i 10 if Check(step)==1 11 GraphColor(step+1) 12 color[step]=0 13 14
4、分析
搜索树有:1+m+m'+...+m"=(m^(n+1)-1)/(m-1)<=(m^(n+1))/(m/2)=2*m" m>=2个结点
每个节点要和其他所有顶点的颜色进行比较,进行n-1次比较最坏时间复杂度为O(nm")
5、源码
https://github.com/ChenyuWu0705/Algorithm-Analyze-and-Design/blob/main/Graph%20color.cpp