图论之---Tarjan及应用.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
图论之 Tarjan及其应用 一、Tarjan应用 1.求强连通分量 2.求lca 3.无向图中,求割点和桥 二、图的遍历算法 (一)、宽度优先遍历(BFS) 1、给定图G和一个源点s, 宽度优先遍历按照从近到远的顺序考虑各条边. 算法求出从s到各点的距离。 宽度优先的过程对结点着色. 白色: 没有考虑过的点(还没有入队的点) 黑色: 已经完全考虑过的点(已经出队的点) 灰色: 发现过, 但没有处理过, 是遍历边界(队列中的点) 依次处理每个灰色结点u, 对于邻接边(u, v), 把v着成灰色并加入树中, 在树中u是v的父亲(parent)或称前驱(predecessor). 距离d[v] = d[u] + 1 整棵树的根为s (二)、深度优先遍历(DFS) 1、初始化: time为0, 所有点为白色, dfs森林为空 对每个白色点u执行一次DFS-VISIT(u) 时间复杂度为O(n+m) 2、伪代码 三、DFS树的性质 1、括号结构性质 对于任意结点对(u, v), 考虑区间[d[u], f[u]]和[d[v], f[v]], 以下三个性质恰有一个成立: 完全分离 u的区间完全包含在v的区间内, 则在dfs树上u是v的后代 v的区间完全包含在u的区间内, 则在dfs树上v是u的后代 2、定理(嵌套区间定理): 在DFS森林中v是u的后代当且仅当d[u]d[v]f[v]f[u], 即区间包含关系. 由区间性质立即得到。 四、边的分类 1、一条边(u, v)可以按如下规则分类 树边(Tree Edges, T): v通过边(u, v)发现 后向边(Back Edges, B): u是v的后代 前向边(Forward Edges, F): v是u的后代 交叉边(Cross Edges, C): 其他边,可以连接同一个DFS树中没有后代关系的两个结点, 也可以连接不同DFS树中的结点。 判断后代关系可以借助定理1 2、算法 当(u, v)第一次被遍历, 考虑v的颜色 白色, (u,v)为T边 灰色, (u,v)为B边 (只有它的祖先是灰色) 黑色: (u,v)为F边或C边. 此时需要进一步判断 d[u]d[v]: F边 (v是u的后代, 因此为F边) d[u]d[v]: C边 (v早就被发现了, 为另一DFS树中) 时间复杂度: O(n+m) 定理: 无向图只有T边和B边 (易证) 树边(T)su①后向边(B 树边(T) s u ① 后向边(B) 交叉边(C) 前向边(F) ② ③ 3、实现细节 if (d[v] == -1) dfs(v); //树边, 递归遍历 else if (f[v] == -1) show(“B”); //后向边 else if (d[v] d[u]) show(“F”); // 前向边 else show(“C”); // 交叉边 注:d(入栈时间戳)和f数组(出栈时间戳)的初值均为-1, 方便了判断 四、强连通图 1、在有向图G中,如果两点互相可达,则称这两个点强连通,如果G中任意两点互相可达,则称G是强连通图。 定理: 一个有向图是强连通的,当且仅当G中有一个回路,它至少包含每个节点一次。 非强连通有向图的极大强连通子图,称为强连通分量。 在上图中,{1,2,3,4}是一个强连通分量,{5},{6}分别是另外两个强连通分量。怎么判断一个图是否是强连通图,如果不是,有哪些强连通分量,又怎么使它成为强连通图呢:Tarjan 五、Tarjan算法 1、Tarjan算法是基于对图深度优先搜索的算法,每个强连通分量为搜索树中的一棵子树。 2、算法思想如下: dfn[u]表示dfs时达到顶点u的次序号,low[u]表示u或u的子树能够追溯到的最早的栈中节点的次序号 ,所以当dfn[u]=low[u]时,以u为根的搜索子树上所有节点是一个强连通分量。 先将顶点u入栈,dfn[u]=low[u]=++idx,扫描u能到达的顶点v,如果v没有被访问过,则dfs(v),low[u]=min(low[u],low[v]),如果v在栈里,low[u]=min(low[u],dfn[v]),扫描完v以后,如果dfn[u]=low[u],则将u及其以上顶点出栈。 3、实例 1.dfn[1]=low[1]=1à2(!vis[2]) 2.dfn[2]=low[2]=2à3(!vis[3]) 3.dfn[3]=low[3]=3à1(vis[1]) low[3]=min(low[3],dfn[1])=1 dfn[3]low[3]à2 2.low[2]=min(low[2],low[3])=1 dfn[2]

文档评论(0)

jyr0221 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档