实验内容与要求:
问题描述:
我们可以将地图转换为平面图,每个地区变成一个节点,相邻地区用边连接,我们要为这个图形的顶点着色,并且两个顶点通过边连接时必须具有不同的颜色。附件是给出的地图数据,请针对三个地图数据尝试分别使用5个(le450_5a),15个(le450_15b),25个(le450_25a)颜色为地图着色。
实验要求:
对下面这个小规模数据,利用四色填色测试算法的正确性;

对附件中给定的地图数据填涂;
随机产生不同规模的图,分析算法效率与图规模的关系(四色)
基本回溯算法
思路:
- 从图的第一个节点开始,尝试为其染色。
- 对于当前节点,尝试为其选择一种颜色,然后递归地尝试为其相邻的未染色节点染色。
- 如果染色过程中出现了冲突,即当前节点与已染色的相邻节点颜色相同,就回溯到上一步重新尝试其他颜色。
- 当所有节点都染色完毕,即递归到最后一个节点时,找到了一种合法的染色方案,返回 1。
- 统计所有合法染色方案的数量,并返回结果。
思维导图:

伪代码:
| 深搜回溯函数 |
|
运行结果:
由运行结果可以看出得到正确的填色方案数为480,但是运行时间为0.00ms,应该是因为数据规模较小,导致程序执行速度非常快,低于计时的精度。
算法过程:
在着色尝试过程中,依次尝试可用的颜色,并更新与当前节点相邻的节点的颜色状态,剔除不可用的颜色。若成功找到一种着色方案,即所有顶点都被成功着色,则返回 True。下面图示以其中一种染色方案为例(从左往右,从上往下):

时间复杂度:
- 在每一次递归调用 DFS1 中,对当前节点进行颜色的尝试,最多需要尝试 MAXCOL 种颜色,所以对于每一个节点,该部分的时间复杂度为 O(MAXCOL)。
- 在每一次颜色尝试中,需要遍历当前节点的所有邻接节点,最坏情况下,有 x-1 个邻接节点,因此该部分的时间复杂度为 O(x)。
- 因为递归调用会在每个节点处进行,总的递归调用次数最多为节点数量 x。
- 因此,总的时间复杂度为 O(x * MAXCOL * x) = O(x^2 * MAXCOL)。即O(n^3),这是一个巨大的指数级别,如果节点数量较少,并且最大可选颜色数量也不是很大时,算法的性能是可以接受的,但是一旦数量增加就很难运行出结果,所以我们一定要对此回溯法进行优化。
优化深搜回溯算法
四种深搜回溯的优化剪枝:优化搜索顺序,排除等效冗余

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



