描述
输入:无向连通图G和m种颜色的集合用这些颜色绘给图的顶点着色,每个顶点一种颜色,要求G的每条边的两个顶点着不同的颜色
输出:所有可能的着色方案,如果不存在告知'no’。
实例
上图表示为有n个点的无向图用3种颜色根据规则着色后结果。
解,使用一个向量来表示,<x1,x2,x3,..,xn>n表示点的下表,而xn表示该点所图颜色序号。
因此,可以得出我们遍历每一个点,而遍历需要满足两个条件,否则回溯
1.当前点是可达的
2.当前点和所选的颜色和连通的其他点不一样。
流程
设m=3 {1,2,3}
1.第一个点使用1号颜色
2.第二点选择1号颜色,但因为第一个点和第二个点连通且颜色相同,开启回溯。
3.第二个选择2号颜色
4.第三个点选择1号颜色,但是和第一个点连通且颜色相同,开启回溯。
5.第三个点选择2号颜色,但是和第二个点连通且颜色相同,开启回溯。
6...
注意,是否一个点是否可以选择使用一个颜色,不是在进入该点(树进入该层)之前判断的,而是进入之后,判断是否满足条件。
结论
1.着色问题是一个以颜色为分支,点树为深度的m叉树
2.如果遍历到了叶节点,说明产生一组可行解
3.解至少存在0个或m个,因为点上的颜色可以整体变换。
时间复杂度
每一个结点要判断是否颜色满足条件,就要去遍历原图,时间复杂度为O(n)
m叉树n个深度,就有nm^n的结点,因此时间复杂度为
O(n)=结点数 * 每个结点的时间复杂度=O(nm^n).