- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第十一章 图的遍历与应用 图的遍历 图的遍历(Graph Traversal ) 从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程 问题 图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点 为了避免重复访问,可设置一个标志顶点是否被访问过的辅助标志 visited 辅助数组 visited 的初始状态为 0, 在图的遍历过程中, 一旦此顶点 被访问, 就立即让 visited 为 1, 防止它被多次访问 图的遍历分类 深度优先搜索 DFS (Depth First Search) 广度优先搜索 BFS (Breadth First Search) 深度优先搜索DFS 深度优先搜索的示例 DFS 在访问图中某一起始顶点 v 后, 由 v 出发, 访问它的任一邻接顶点 w1; 再从 w1 出发,访问与 w1邻 接但还没有访问过的顶点 w2; 然后再从 w2 出发, 进行类似的访问, … 如此进行下去, 直至到达所有的邻接顶点都被访问过的顶点 u 为止。接着, 退回一步, 退到前一次刚访问过的顶点, 看是否还有其它没有被访问的邻接顶点。如果有, 则访问此顶点, 之后再从此顶点出发, 进行与前述类似的访问; 如果没有, 就再退回一步进行搜索。重复上述过程, 直到连通图中所有顶点都被访问过为止。 算法实现 递归实现 例子 广度优先搜索BFS 广度优先搜索的示例 算法描述 BFS在访问了起始顶点 v 之后, 由 v 出发, 依次访问 v 的各个未被访问过的邻接顶点 w1, w2, …, wt, 然后再顺序访问 w1, w2, …, wt 的所有还未被访问过的邻接顶点。再从这些访问过的顶点出发,再访问它们的所有还未被访问过的邻接顶点,… 如此做下去,直到图中所有顶点都被访问到为止。 算法实现 广度优先搜索是一种分层的搜索过程, 每向前走一步可能访问一批顶点, 不像深度优先搜索那样有往回退的情况。因此, 广度优先搜索不是一个递归的过程。 为了实现逐层访问, 算法中使用了一个队列,以记忆正在访问的这一层和上一层的顶点,以便于向下一层访问。 为避免重复访问, 需要一个辅助数组 visited[ ],给被访问过的顶点加标记。 算法流程图 例子 非连通图的连通分量 当无向图为非连通图时, 从图中某一顶点出发, 利用深度优先搜索算法或广度优先搜索算法不可能遍历到图中的所有顶点, 只能访问到该顶点所在的最大连通子图(连通分量)的所有顶点。 连通分量 若从无向图的每一个连通分量中的一个顶点出发进行遍历, 可求得无向图的所有连通分量。 在算法中, 需要对图的每一个顶点进行检测:若已被访问过,则该顶点一定是落在图中已求得的连通分量上;若还未被访问,则从该顶点出发遍历图,可求得图的另一个连通分量。 对于非连通的无向图,所有连通分量的生成树组成了非连通图的生成森林。 【例】以深度优先搜索方法从顶点 出发遍历图, 建立深度优先生成森林。 重连通分量 (Biconnected Component) 在无向连通图G中, 当且仅当删去G中的顶点v及所有依附于v的所有边后, 可将图分割成两个或两个以上的连通分量,则称顶点v为关节点。 没有关节点的连通图叫做重连通图。 在重连通图上, 任何一对顶点之间至少存在有两条路径, 在删去某个顶点及与该顶点相关联的边时, 也不破坏图的连通性。 一个连通图G如果不是重连通图,那么它可以包括几个重连通分量。 在一个无向连通图G中, 重连通分量可以利用深度优先生成树找到。 在图中各顶点旁标明的深度优先数, 给出进行深度优先搜索时各顶点访问的次序。 深度优先生成树的根是关节点的充要条件是它至少有两个子女。 其它顶点 u 是关节点的充要条件是它至少有一个子女 w, 从 w 出发, 不能通过 w、w 的子孙及一条回边所组成的路径到达 u 的祖先。 最小生成树 minimum cost spanning tree 最小生成树 使用不同的遍历图的方法,可以得到不同的生成树;从不同的顶点出发,也可能得到不同的生成树。 按照生成树的定义,n 个顶点的连通网络的生成树有 n 个顶点、n-1 条边。 构造最小生成树的准则 必须使用且仅使用该网络中的n-1 条边来联结网络中的 n 个顶点; 不能使用产生回路的边; 各边上的权值的总和达到最小 思考 如何设计算法生成最小生成树? 克鲁斯卡尔 (Kruskal) 算法 克鲁斯卡尔算法的基本思想: 设有一个有 n 个顶点的连通网络 N = { V, E }, 最初先构造一个只有 n 个顶点, 没有边的非连通图 T
文档评论(0)