图的着色问题

1. 问题

给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色

2. 解析

通过回溯的方法,不断的为每一个节点着色,在前面n-1个节点都合法的着色之后,开始对第n个节点进行着色,这时候枚举可用的m个颜色,通过和第n个节点相邻的节点的颜色,来判断这个颜色是否合法,如果找到那么一种颜色使得第n个节点能够着色,那么说明m种颜色的方案是可行的

3. 设计

bool Same(int t) {

for i to n

if c[t][i] == 1 && col[i] == col[t]

return false;

return true;

}

void BackTrack(int t) {

if t > n

sum++;

for i to n

printf(col[i]);

else

for i to m

col[t] = i;

if (Same(t))

BackTrack(t + 1);

col[t] = 0;

4. 分析

搜索树有1+m+.....+mn=mn+1-1 / m-1 <=2mn , m>2个节点,每个节点要和其他所有节点的颜色进行n-1次比较,Onmn

5. 源码

[github源码地址]

 

posted @ 2021-06-06 23:20  starshine0618  阅读(123)  评论(0编辑  收藏  举报