- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
预备知识_回溯法
回溯法:在实际生活中,有些问题是不能用数学公式去解决的,它需要通过一个过程,此过程要经过若干个步骤才能完成,每一个步骤又分为若干种可能;同时,为了完成任务,还必须遵守一些规则,但这些规则无法用数学公式表示,对于这样一类问题,一般采用搜索的方法来解决,回溯法就是搜索算法(广度优先、深度优先等)中的一种控制策略,它能够解决许多搜索中问题。
回溯法基本思想:试探法,撞了南墙就回头。(一般采用深度优先搜索策略)
搜索策略:深度优先(不撞南墙不回头)。
在搜索过程中,如果求解失败,则返回搜索步骤中的上一点,去寻找新的路径,以求得答案。要返回搜索,前进中的某些状态必须保存,才能使得退回到某种状态后能继续向前。
白话搜索:如果用数组存放搜索信息,i表示数组下标(当前状态), ++i表示往前走(下一个状态),--i表示回溯(往回退,返回上一次状态)。
第8节 图论应用实例_图着色(graph coloring)问题
数学定义:给定一个无向图G=(V, E),其中V为顶点集合,E为边集合,图着色问题即为将V分为个颜色组,每个组形成一个独立集,即其中没有相邻的顶点。其优化版本是希望获得最小的值。
-着色判定问题给定无向连通图G和种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色,是否有一种着色法使G中任意相邻的2个顶点着不同颜色
图1
问题分析:
(1)属于图的搜索问题。将问题简化:将每个省抽象为一个点,省之间的联系看为一条边,可以得到图2。
图2
(2)用邻接矩阵表示各省之间的相邻关系,二维数组实现:
由图2可以得到如下矩阵:(对称矩阵)
1 2 3 4 5 6 7 1 0 1 0 0 0 0 1 2 1 0 1 1 1 1 1 3 0 1 0 1 0 0 0 4 0 1 1 0 1 0 0 5 0 1 0 1 0 1 0 6 0 1 0 0 1 0 1 7 1 1 0 0 0 1 0 为一对称矩阵。
(3)从编号为1的省开始按四种颜色顺序填色,当第1个省颜色与相邻省颜色不同时,就可以确定第1个省的颜色,然后,再依次对第2、第3,……,进行处理,直到所有省份颜色都涂上为止。
(4)问题关键在于填色过程中,如果即将填的颜色与相邻省的颜色相同,而且四种颜色都试探过,均不能满足要求,则需要回溯到上一个点(即前一个省),修改上一个省的颜色,重新试探下一个省的颜色。
参考代码:(学生版本)
//回溯法:地图四色问题
// 大致思路:从第1个节点开始扫描,第1个节点颜色为1,第i个节点欲试探的颜色为color(color从1开始),
//循环判断i与已着色的前i-1个节点是否相邻,如果相邻且颜色也相同,那么颜色color则不合适,立刻跳出循环,
//下一个试探的颜色为++color,并且重新开始循环判断,试探下一个颜色是否合适。
//如果i与前i-1个节点循环判断后没有既相邻又同颜色的,那么第i个节点颜色为当前的color。
// 但是如果color到4都没有符合条件,那么我们就需要重新对i-1节点重新着色(回溯),它的颜色应该+1,并且继续循环判断i-1节点。
#includeiostream
#includefstream
using namespace std;
const int MAX=100;
void mapcolor(int x[],int r[][MAX],int n);//x数组:各节点着色结果;r数组:节点关系邻接矩阵;n:节点数
int main()
{
int r[MAX][MAX],x[MAX];
int n,i,j;
ifstream cin(map.txt);
cinn;
for(i=0;in;++i) //邻接矩阵初始化
for(j=0;jn;++j)r[i][j]=-1;
for(i=0;in;++i) //输入节点邻接矩阵
for(j=0;jn;++j)cinr[i][j];
mapcolor(x,r,n);//节点着色
for(i=0;in;++i) //输出解coutcolor of node i+1 : x[i]endl;
return 0;
}
void mapcolor(int x[],int r[][MAX],int n)
{
int i,color,j;//i:欲着色的当前节点,j:已着色的节点
x[0]=1;//第1个节点颜色为1
i=1;//节点计数
color=1;//颜色,从1开始
while(in)//以节点为扫描对象,从第2个节点开始,通过判断和前面已着色的i-1个节点是否冲突,为节点i试探合适的颜色
while(color=4 in)//对于每一个节点i,
文档评论(0)