- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第2章 图遍历
第2章 图的遍历;图的遍历(Graph Traversal)的含义:从已给图中的某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次(注意理解)。
深度优先搜索(Depth First Search):是一个递归过程,有回退过程,它的思想在很多题目当中要用到。
广度优先搜索(Breadth First Search) :是一个分层的搜索过程,没有回退的情况,是非递归的。;2.1 DFS遍历;DFS算法的思想:在访问图中某一起始顶点v后,由v出发,访问它的某一邻接顶点w1;再从w1出发,访问与w1邻接但还没有访问过的顶点w2;然后再从w2出发,进行类似的访问;…;如此进行下去,直至到达所有的邻接顶点都被访问过的顶点u为止;接着,回退一步,回退到前一次刚访问过的顶点,看是否还有其它没有被访问的邻接顶点。如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;如果没有,就再回退一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。;以图2.1(a)所示的无向连通图为例解释DFS搜索过程。假设在多个未访问过的邻接顶点中进行选择时,按顶点序号从小到大的顺序进行选择,比如顶点A有3个邻接顶点,即B、D和E,首先选择顶点B进行深度优先搜索。;对图2.1(a)所示的无向连通图,采用DFS思想搜索的过程为(在图(a)中,箭头旁的数字跟下面的序号对应):
(1) 从顶点A出发,访问顶点序号最小的邻接顶点,即顶点B;
(2) 然后访问顶点B的一个未访问过的邻接顶点,即顶点C;
(3) 接着访问顶点C的一个未访问过的邻接顶点,即顶点G;
(4) 此时顶点G已经没有未访问过的邻接顶点了,所以回退到顶点C;
(5) 回退到顶点C后,顶点C也没有未访问过的邻接顶点了,所以继续回退到顶点B;;(6) 顶点B还有一个未访问过的邻接顶点,即顶点E,所以访问顶点E;
(7) 然后访问顶点E的一个未访问过的邻接顶点,即顶点F;
(8) 顶点F有两个未访问过的邻接顶点,选择顶点序号最小的,即顶点D,所以访问D;
(9) 此时顶点D已经没有未访问过的邻接顶点了,所以回退到顶点F;
(10) 顶点F还有一个未访问过的邻接顶点,即顶点H,所以访问顶点H;
(11) 然后访问顶点H的一个未访问过的邻接顶点,即顶点I;
(12) 此时顶点I已经没有未访问过的邻接顶点了,所以回退到顶点H;;(13) 回退到顶点H后,顶点H也没有未访问过的邻接顶点了,所以继续回退到顶点F;
(14) 回退到顶点F后,顶点F也没有未访问过的邻接顶点了,所以继续回退到顶点E;
(15) 回退到顶点E后,顶点E也没有未访问过的邻接顶点了,所以继续回退到顶点B;
(16) 回退到顶点B后,顶点B也没有未访问过的邻接顶点了,所以继续回退到顶点A;;在图2.1(b)中,每个顶点外侧的数字标明了进行深度优先搜索时各顶点访问的次序,称为顶点的深度优先数。图(b)还给出了访问n个顶点时经过的n-1条边,这n-1条边将n个顶点联结成一个树,称此图为原图的深度优先生成树,该树的根结点就是深度优先搜索的起始顶点。
在图(b)中,为了更加直观地描述该生成树的树形结构,将此生成树改画成图(b)中右图所示的树形形状。;2.1.2 DFS算法的实现及复杂度分析;DFS( 顶点 i ) //从顶点i进行深度优先搜索
{
visited[ i ] = 1; //将顶点i的访问标志置为1
p = 顶点i的边链表表头指针;
while( p不为空 )
{
//设指针p所指向的边结点所表示的边的另一个顶点为顶点j
if( 顶点j未访问过 )
{
//递归搜索前的准备工作需要在这里写代码
//如例2.1
DFS( 顶点j );
//以下是DFS的回退位置,在很多应用中需要
//在这里写代码,比如求关节点
}
p = p-nextarc; //p移向下一个边结点
}
};DFS( 顶点 i ) //从顶点i进行深度优先搜索
{
visited[ i ] = 1; //将顶点i的访问标志置为1
for( j=0; jn; j++ ) //对其他所有顶点j
{
//j是i的邻接顶点,且顶点j没有访问过
if( Edge[i][j]==1 !visited[j] )
{
//递归搜索前的准备工作需要在这里写代码
//如例2.1
DFS( j ) //从顶点w出发进行DFS搜索
//以下是DFS的回退位置,在很多应用中需要
//在这里写代码,比如求关节点
}
}
};上述伪代码中,在递归调用DFS前后的两个位置特别重要:
如果需要在递归搜索前做一些准备工作,如例2.1,则需要在DFS递归调用前的
您可能关注的文档
最近下载
- 建筑室内设计专业职业生涯规划.pptx
- 语文古诗:渔家傲和苏幕遮的对比.ppt VIP
- 煤灰分的测定.ppt VIP
- 《照明线路的安装与检修》学习任务设计方案6实训室照明电路的安装学习任务设计方案.doc VIP
- 2024年1月浙江省高三普通高校招生方向性测试物理试题卷含答案.pdf VIP
- 1.3《闪亮的坐标—劳模王进喜》获奖课件.pptx VIP
- 液化石油气管理人员安全考核考试试卷及答案.docx VIP
- 第九讲中国健康生活方式预防心血管代谢疾病指南之合理膳食篇.docx VIP
- 中国的商业与货币经济 (2).pptx
- 植物新品种特异性稳定性一致性测试指引亚麻-农业部植物新品种.pdf VIP
原创力文档


文档评论(0)