73 图的遍历 - read.ppt

  1. 1、本文档共19页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
图的遍历一深度优先搜索深度优先搜索遍历步骤二广度优先搜索广度优先搜索遍历步骤最小生成树求最小生成树典型用途讨论如何求得最小生成树二普里姆算法普里姆算法思想令集合的初值为集合从所有结点和结点的带权边中选出具有最小权值的边将结点加入集合中将边加入集合中如此不断重复当时最小生成树便构造完毕三克鲁斯卡尔算法克鲁斯卡尔算法思想设无向连通带权图其中为结点的集合为边的集合设带权图的最小生成树由结点集合和边的集合构成其初值为既初始时最小生成树只由带权图中结点集合组成各结点之间没有一条边这样最小生成树中的各个结点

8.4 图的遍历 一、深度优先搜索( DFS ) 深度优先搜索(遍历)步骤: 二、广度优先搜索( BFS ) 广度优先搜索(遍历)步骤: 8.5 最小生成树 3.求最小生成树 4、典型用途: 讨论:如何求得最小生成树? 二、普里姆算法 1、普里姆(Prim)算法思想 令集合U的初值为U={u0},集合T={}。从所有结点u∈U和结点v∈V\U的带权边中选出具有最小权值的边(u,v),将结点v加入集合U中,将边(u,v)加入集合T中。如此不断重复,当U=V时,最小生成树便构造完毕。 三、克鲁斯卡尔(Kruska)算法 1、克鲁斯卡尔算法思想 设无向连通带权图G=(V,E),其中V为结点的集合,E为边的集合。设带权图G的最小生成树T由结点集合和边的集合构成,其初值为T=(V,{}),既初始时最小生成树T只由带权图G中结点集合组成,各结点之间没有一条边。这样,最小生成树T中的各个结点各自构成一个连通分量。然后,按照边的权值递增的顺序考察带权图G中边集合E的各条边,若被考察的边的两个结点属于T的两个不同的连通分量,则将此边加入到最小生成树T中,同时,把两个连通分量连接为一个连通分量;若被考察的边的两个结点属于T的同一个连通分量,则将此边舍去。如此下去,当T中的连通分量个数为1时,T中的该连通分量即为带权图G的一棵最小生成树。 2、克鲁斯卡尔算法示例: 8.6 最短路径 两种常见的最短路径问题: 一、 单源最短路径—用Dijkstra(迪杰斯特拉)算法 二、所有顶点间的最短路径—用Floyd(弗洛伊德)算法 一、最短路径的基本概念 1、图的最短路径和最短路径长度 图中从一个结点到另一个结点可能存在多条路径,路径长度最短的那条路径称作最短路径。其长度称作最短路径长度。 2、带权图的最短路径和最短路径长度 带权图中从一个结点到另一个结点可能存在多条路径,带权路径长度最短的那条路径称作最短路径。其带权路径长度称作最短路径长度。 1、狄克斯特拉(Dijkstra) 算法思想 设置两个结点的集合S和T,集合S中存放已找到最短路径的结点,集合T中存放当前还未找到最短路径的结点。初始状态时,集合S中只包含源点,设为v0,然后不断从集合T中选择到源点v0路径长度最短的结点u加入到集合S中,集合S中每加入一个新的结点u都要修改从源点v0到集合T中剩余结点的当前最短路径长度值,集合T中各结点的新的当前最短路径长度值,为原来的最短路径长度值与从源点过结点u到达该结点的路径长度中的较小者。此过程不断重复,直到集合T中的结点全部加入到集合S中为止。 1、采用狄克斯特拉算法实现 算法思想:每次以不同的结点作为源点,调用狄克斯特拉算法求出从该源点到其余结点的最短路径。需重复调用n次狄克斯特拉算法。 2、采用弗洛伊德算法,其算法思想如下: * * 一、深度优先搜索 二、广度优先搜索 遍历定义:从已给的连通图中某一顶点出发,沿着一些边,访遍图中所有的顶点,且使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。 遍历实质:找每个顶点的邻接点的过程。 图的特点:图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。 解决思路:可设置一个辅助数组 visited [n ],用来标记每个被访问过的顶点。它的初始状态为0,在图的遍历过程中,一旦某一个顶点i 被访问,就立即改 visited [i]为1,防止它被多次访问。 图常用的遍历: 怎样避免重复访问? 基本思想:——仿树的先序遍历过程。 Depth_First Search v1 v1 v2 v3 v8 v7 v6 v4 v5 DFS 结果 例1: → → → → → → → v2 v4 v8 v5 v3 v6 v7 例2: v2 → v1 → v3 → v5 → DFS 结果 v4 → v6 起点 起点 应退回到V8,因为V2已有标记 详细归纳: 在访问图中某一起始顶点 v 后,由 v 出发,访问它的任一邻接顶点 w1; 再从 w1 出发,访问与 w1邻接但还未被访问过的顶点 w2; 然后再从 w2 出发,进行类似的访问,… 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点 u 为止。 接着,退回一步,退到前一次刚访问过的顶点,看是否还有其它未被访问的邻接顶点。 如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问; 如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。 简单归纳: 访问起始点 v; 若v的第1个邻接点没访问过,深度遍历此邻接点; 若当前邻接点已访问过,再找v的第2个邻接点重新遍历。 基

文档评论(0)

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

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

1亿VIP精品文档

相关文档