- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
三、遍历应用举例.PDF
三、遍历应用举例
1. 求一条从顶点 i 到顶点 s 的
简单路径
2. 求两个顶点之间的一条路径
长度最短的路径
1
1. 求一条从顶点 i 到顶点 s 的简单路径
例如:
求从顶点 b 到顶
g
点 k 的一条简单路径。 b
从顶点 b 出发进行 a
深度优先搜索遍历。
假设找到的第一个 c d e f
邻接点是c,则得到的结
点访问序列为: h k
b c h d a e k f g ,
假设找到的第一个邻接点是a,则得到的结点
访问序列为: b a d h c e k f g 。
思考: 如何查找此路径?
遍历过程中,检查是否到终点,是则止,
否则继续。可能需进行若干次试探、回溯 2
结论:
1. 从顶点 i 到顶点 s ,若存在路径,则
从顶点 i 出发进行深度优先搜索,必能
搜索到顶点 s 。
2. 遍历过程中搜索到的顶点不一定是路
径上的顶点,则将该顶点从路径中删去,
如搜索路径为:i, … , h , v’,… , 再从h出发重
新探索下一条路经。
3. 由它出发进行的深度优先遍历整个图,
已经完成的顶点不是路径上的顶点,则说
明不存在路径(i,…,s)。
3
void DFSearch( int v, int s, char *PATH)
{// 从第v个顶点出发递归地深度优先遍历图G,求得一条从v到s的简单路径,并记录在PATH 中
visited[v] = TRUE; // 访问第 v 个顶点 ,能不被重复访问
Append(PATH, getVertex(v)); // 第v个顶点加入路径 //k++ ;
for (w=FirstAdjVex(G ,v); w!=0!found;
w=NextAdjVex(G ,v ,w) )
{ if (w==s) { found =TRUE; Append(PATH, w);exit(1) ;} //找到退出
else if (!visited[w]) DFSearch(w, s, PATH);//加入w
} //end for
if (!found) Delete (PATH ,v); // 从路径上删除顶点 v
} //
4
7.27 求有向图G的顶点v到s是否存在长度为k的简单路径
void DFSearch( int v, int s,int k, char *PATH) {
//判断邻接表方式存储的有向图G的顶点v到s是否存在长度为k的简单路径,并记录在PATH 中
if(v==sk==0) //找到了一条路径,且长度符合要求
{ found=TRUE; Append(PATH, v);return ;
else if(k0) {
visited[v] = TRUE; // 访问第 v 个顶点
Append(PATH, getVertex(v)); L++ ; // 第v个顶点加入路径
for (w=FirstAdjVex(G,v);
文档评论(0)