一、实验目的
1 理解搜索树与解空间树的区别
2 理解回溯法\分支限界法\穷举搜索的区别
3 理解回溯法的特征(基于解空间树\纵向优先\剪枝) 和 分支限界法的特征(基于解空间树\横向优先\剪枝)
4掌握回溯法的简单实现和时间复杂度分析
- 实验内容
1、图着色问题
2、0/1背包问题
三、问题分析
1、图着色问题:
回溯法求解图着色问题时,首先把所有顶点的颜色初始化为0,然后依次为每个顶点着色,如果当前顶点着色没有冲突,则继续为下一个顶点着色,否则,为当前顶点着下一个颜色,如果所有m种颜色都试探过并且不发生冲突,则回溯到当前顶点的上一个顶点,以此类推;
2、0/1背包问题
回溯法求解0/1背包问题时,不断的去试探每个重量的物品,然后如若发生冲突,就是重量已经超过背包了,那就回溯到上一个物品;
四、问题解决
1、图着色问题
(1)、算法:回溯法求解图着色问题GrapghColor
输入:图G=(V,E),m种颜色
输出:n个顶点的着色情况color[n]
过程:1、将数组color[n]初始化为0;
2、i=0;
3、当i>=0为顶点i着色:
3.1、依次考查每一种颜色,若顶点i的着色与其他顶点的着色不发生冲突,则转步骤3.2;否则,搜索下一颜色;
3.2、如果color[i]大于m,重置顶点i的着色情况,i=i-1,转步骤3回溯;
3.3、若顶点i是一个合法的着色且顶点尚未全部着色,则i=i+1,转步骤3处理下一个顶点;
3.4、若顶点已全部着色,则输出数组color[n],算法结束;
(2)、代码:
void GraphColor(int m,int [][]arc,int []color,int n){/*m种颜色,n个顶点,数组arc[]存储图,color[]存储颜色*/
int i,j;
for (i=0;