- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
浅谈dfs
信息学竞赛讲座 搜索题例---!!!!!!----------------------------------精品文档,值得下载,可以编辑!!!-----------------------------!!!!!!-----------
!!!!!!!!----------------------------------精品文档,值得下载,可以编辑!!!-----------------------------!!!!!!
广度优先搜索是分层次搜索,广泛应用于求解问题的最短路径、最少步骤、最优方法等方面。像最短路径问题、分酒问题、八数码问题都是典型的DFS.
例1:最短路径问题
求从任意一个顶点Vi出发,对给出的图,求到达任意顶点Vj(ij)的所有最短路径
[问题分析]
1、首先用邻接表表示此图各端点的邻接关系。
顶点 接邻顶点 个数
1 2 3 4 3
2 1 3 7 3
3 1 2 4 5 4
4 1 3 6 3
5 3 6 7 8 4
6 4 5 8 3
7 2 5 8 3
8 5 6 7 3
2、数据结构
const
d:array[1..8,1..4] of byte=((2,3,4,0),(1,3,7,0),(1,2,4,5),(1,3,6,0),(3,6,7,8),(4,5,8,0),(2,5,8,0),(5,6,7,0))
{二维数组存放邻接表}
n:array[1..8] of byte=(3,3,4,3,4,3,3,3); {存放邻接顶点数}
var
L:array[1..64] of byte {队列}
F,r:byte {f队头指针,r队尾指针}
B:array[1..64] of byte {链接表,表示某一个结点的前趋结点}
G:array[1..10] of byte {表示层结点的首结点在队列开始的位置}
H:byte {搜索的层次}
由于搜索过的点不再进行搜索,故设置一个数组E[M]为标记,表示结点M是否访问过
e:array[1..8] of 0..1;{用1表示已访问过,0表示还没有访问}
c:array[1..8,1..8]of byte; {C[s,j]存储到达目标结点后各最短路径的线路}
bb:Boolean {搜索结束标记}
3、算法描述
⑴设立初值,并令起始结点进队:
f:=0;r:=1;lL[r]:=st,E[st]:=1;w:=1;h:=1;
⑵将此时第h层(开始h=1,表示第一层)的w(开始时w=1,表示一个结点)顶点的顺序出队,并访问与该层各顶点相邻接但又没有访问过的顶点,同时将这些结点进队列,且设立前趋链接指针和访问过标记,若此时的结点为目标结点,则只设立前趋链接指针而不设立访问过标记
⑶计算此时第h+1层的顶点个数w:=r+1-g[h],然后看该层有多少个顶点为目标结点,凡是出现目标顶点的,就将其个数累计,也就是为最短路径的条数,同时从这个目标结点按前趋链接指针将到达该目标结点的路径的各个顶点编号存入c[s,j]中,然后转⑷,若目标顶点累计个数为0,表明该层没有出现目标结点,则转⑵。
⑷打印搜索到的各条最短路径的各结点编号,并结束程序。
程序如下:(见exp7_1.pas)
program exp7_1;
const
d:array[1..8,1..4] of byte=((2,3,4,0),(1,3,7,0),(1,2,4,5),(1,3,6,0),(3,6,7,8),(4,5,8,0),(2,5,8,0),(5,6,7,0));
n:array[1..8] of byte=(3,3,4,3,4,3,3,3);
var
L,b:array[1..64] of byte;
F,r,h,m,st,ed,I,j,t,k,s,p,w:byte;
G:array[1..10] of byte;
e:array[1..8] of 0..1;
c:array[1..8,1..8]of byte;
bb:Boolean;
begin
write(start:);readln(st);
write(end:);readln(ed);
fillchar(e,sizeof(e),0); {标记数组清零}
fillchar(c,sizeof(c),0); {路径数组清零}
f:=0;r:=1;L[r]:=st;h:
文档评论(0)