网站大量收购闲置独家精品文档,联系QQ:2885784924

计算机算法基础 第2版 习题及答案 第16章 .docx

计算机算法基础 第2版 习题及答案 第16章 .docx

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

PAGE16

第16章 穷举搜索

用回溯法设计一个给图G(V,E)着色的算法。我们假定图是用邻接矩阵表示,而可用颜色的集合是C={1,2,…,m},m可视为常数。我们要求把所有合法的着色全部输出。

解: 假设图的顶点集合是V={v1,v2,…,vn},邻接矩阵是A[1..n,1..n],其中A[i,j]=1表示顶点vi和vj之间有边(1≤i,j≤n)。我们用一个n元组(x[1],x[2],…,x[n])表示对这n个顶点的着色,其中x[i]?C是对顶点vi的着色(1≤i≤n),这是着色问题的一个显示约束。图G的一个合法的着色还必须满足隐式约束,即如果A[i,j]=1,那么必须有x[i]?x[j]。

搜索树中第k层的一个点x用一个k元组x[1..k]=(x[1],x[2],…,x[k])表示,它表示前k个顶点已着色为x[1],x[2],…,x[k],它的儿子有m个,每个对应一个(k+1)元组,x[1..k+1]=(x[1],x[2],…,x[k],x[k+1]),其中x[k+1]分别是1,2,…,和m。

我们先设计一个判定函数Valid(k,c,x[1..k-1]),用来检查树中(k-1)层的一个活点(x[1],x[2],…,x[k-1])的一个儿子y=(x[1],x[2],…,x[1..k-1],x[k]),如果x[k]=c,也就是把顶点vk着色为c,是否是活点。这里,一个k层的活点要满足显示约束x[i]?C,还要满足前k个顶点的隐式约束。下面是Valid(k,c,x[1..k-1])算法的伪码。

Valid(k,c,x[1..k-1]) //图G(V,E)的邻接矩阵A为默认输入

//input:A[1..n,1..n],x[1..k-1],k,c (如果k=1,则x[1..k-1]为空,用x[0]=0表示)

fori?1tok-1

ifA[k,i]=1andx[i]=c

thenreturnfalse

endif

endfor

returntrue

End

下面是给图G(V,E)着色的回溯法的伪码

m-Color(k,x[1..k-1]) //这是回溯法的递归形式供后面主程序调用,矩阵A为默认输入

//input:x[1..k-1],A[1..n,1..n],k(如果k=1,则x[1..k-1]为空,用x[0]=0表示)

forc?1tom

ifvalid(k,c,x[1..k-1]))=true

then x[k]?c //第k个点着色为c,这个儿子是活点

ifk=n //这个点是答案点

then count?count+1 //全局变量,统计答案点个数

outputx[1..n] //输出这个合法着色

else m-color(k+1,x[1..k]) //否则从这点递归下去

endif

endif

endfor

End

下面是主程序

Color-Main(A[1..n,1..n],C) //C={1,2,…,m}

//input:A[1..n,1..n],C

count?0

x[0]?0

m-color(1,x[0])

ifcount=0

thenreturn(notm-colorable)

elsereturn(Thereare’count‘differentvalidcolorings)

endif

End

我们知道,找出图G(V,E)的一个最大团是一个NPC问题。请设计一个回溯算法来搜索图G的一个最大团。假定图G是用邻接矩阵表示的。

解: 假设图G的顶点集合是V={v1,v2,…,vn},邻接矩阵是A[1..n,1..n],其中A[i,j]=1表示顶点vi和vj之间有边。我们用一个k元组x=(x[1],x[2],…,x[k])表示搜索树中k层的一个点,它代表前面k个顶点的一个子集C(k≤n),其中x[i]=1表示vi属于集合C,而x[i]=0表示vi不属于集合C(1≤i≤k)。子集C也许是一个团,也许不是。因此,x[i]?{0,1}是这个搜索空间的显示约束(1≤i≤n)。一个k层的点x有两个k+1层的儿子,它们是在点x所代表的子集C的基础上,对应x[k+1]的两个取值,一个是x[k+1]=0

文档评论(0)

balala11 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档