Tarjan的其他应用.docVIP

  1. 1、本文档共4页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Contents 定义 描述 Tarjan算法求割点、桥、缩点 求双连通分量以及构造双连通分量 求最近公共祖先(LCA) 正文 定义: 割点:如果在图G中删去一个点v,连通分量数量增加,即w(G-v) w(G),则称v为G的割点。 割点集合:在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。 桥(割边):如果在图G中删去一个边e,连通分量数量增加,即w(G-e) w(G),则称e为G的桥。 点连通度:最小割点集合中的顶点数。 割边集合:如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合。 边连通度:一个图的边连通度的定义为,最小割边集合中的边数。 缩点:把没有割边的连通子图缩为一个点,此时满足任意两点之间都有两条路径可达。 注:求块求缩点。缩点后变成一棵k个点k-1条割边连接成的树。而割点可以存在于多个块中。G中普通的边,即如果结点v在搜索边(u, v)时第一次被发现,那么边(u, v)就是一个树枝。 反向边:深度优先搜索树中连结结点u到它的祖先v的那些边,自环也被认为是反向边。 正向边:深度优先搜索树中连接顶点u到它的后裔的非树枝的边。 交叉边:所有其它类型的边,它们可以连结同一棵深度优先搜索树中的两个结点,只要一结点不是另一结点的祖先(一般来讲两个结点是一种兄弟关系),也可以连结分属两棵深度优先搜索树的结点。 描述 DFS 在对于任选一个图中结点为根的DFS搜索树中建立一个LAB数组与LOW数组; LAB数组存储个结点的编号,LOW数组存储各点及其子树的各结点能到达的最小编号结点的编号; DFS(u) //lab为一个全局变量,初始为1,LAB数组各项初始为0; LAB[u] = LOW[u] = lab++ //1 for each (u, v) in E(G) //2 if LAB[v] is 0 //3 DFS(v) //4 LOW[u] = min{LOW[u], LOW[v]} //5 else if v is not parent of u //6 LOW[u] = min{LOW[u], LAB[v]} //7 第3行中,如果(u,v)是树边,则对v做深度优先搜索,并且LOW[u]=min{LOW[u],LOW[v]}; 如果(u,v)是反向边,则low[u] = min(low[u],lab[v]); 割点 U是割点必须满足一下条件之一: u为根且至少有两棵子树; u不为根且存在一个u在深搜树中的子女v使LOW[v] = lab[u]. 桥 一条边e=(u,v)是桥,当且仅当e为树枝边且LOW[v]LAB[u]; 三、Tarjan算法求割点、桥、缩点 在Tarjan中,我们得到dfn和low两个数组: Low[u] = min(low[u],low[v]) ---(u,v)为树枝边,v为u的子树; Low[u] = min(low[u],dfn[v]) ---(u,v)为后向边,v不是u的子树 下面对其进行讨论: 若low[v]=dfn[u],则u为割点,节点v的子孙和节点u形成一个块。因为这说明v的子孙不能够通过其他边到达u的祖先,这样去掉u之后,图必然分裂为两个子图。这样我们处理点u时,首先递归u的子节点v,然后从v回溯至u后,如果发现上述不等式成立,则找到了一个割点u,并且u和v的子树构成一个块。 void tarjan(int x) { v[x]=1,dfn[x]=low[x]=++num; for(int i=head[x];i;i=next[i]) if(!v[ver[i]]) { tarjan(ver[i]); low[x]=min(low[x],low[ver[i]]); if(dfn[x]=low[ver[i]]) v[x]++; } else low[x]=min(low[x],dfn[ver[i]]); if((x==1v[x]2)||(x1v[x]1)) v[x]=2; else v[x]=1;//v[x]=2表示该点为割点,注意其中第一个点要特判 } 若low[v]dfn[u],则(u,v)为割

文档评论(0)

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

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

1亿VIP精品文档

相关文档