声明:

一下许多内容摘自:
北京大学暑期课《ACM/ICPC竞赛训练》强连通分支、桥和割点 北京大学信息学院 郭炜


不建议初学者直接看这篇博文
可以先了解一下Tarjan算法的具体流程,再来看证明。
推荐:全网最!详!细!tarjan算法讲解


强连通分量

如果有向图G的每两个顶点都强连通,称G为强连通图。
非强连通图有向图的极大强连通子图,称为强连通分量。

算法流程

DFN[i]表示 遍历到 i 点时是啥时候(DFS过程中的访问序号)。
所以DFN[i]越小,就说其越“早”。
LOW[i]表示从i节点出发 DFS过程中 i下方节点v1^1(开始时间大于DFN[i],且由i可达的点)所能到达的最早节点的开始时间。DFS过程中,碰到哪个节点,就将哪个节点入栈。栈中节点只有在其所属的强连通分量已经全部求出时,才会出栈。
对于u的子节点v,从v出发进行的DFS结束回到u 时,使得 LOW[u] = min(LOW[u],LOW[v])。因为u可达v, 所以v可达的最早的节点,也是u可达的。
如果发现某节点u 有边连到栈里的节点v2^2,则更新u的LOW值为min(LOW[u],DFN[v]) ,若LOW[u]被更新为DFN[v],则表明目前发现u可达的最早的节点是v. (注意v在栈中,v比u先被访问到)
如果一个节点u,从其出发进行的DFS已经全部完成并回到u,而且此时其LOW值等于DFN值,则说明 u可达的所有节点,都不能到达任何比u早的节点 — 那么该节点u就是一个强连通分量在DFS搜索树 中的根。那么现在将栈中u及u上方的节点全部弹出,弹出的节点构成一个强连通分量。
伪代码:

void Tarjan(u)
{dfn[u]=low[u]=++index  stack.push(u)  for each (u, v) in E {   if (v is not visted){tarjan(v)     low[u] = min(low[u], low[v])}   else if (v in stack)   {low[u] = min(low[u], dfn[v])}  }  if (dfn[u] == low[u]){   //u是一个强连通分量的根   repeat     v = stack.pop     print v    until (u== v)   } //退栈,把整个强连通分量都弹出来 }
}  //复杂度是O(E+V)的

证明:

为什么从u出发的DFS全部结束回到u时,若 dfn[u]=low[u], 此时将栈中u及其上方的节点 弹出,就找到了一个强连通分量?
强连通分量的特性:有向边,任意两个节点都可以相互到达。
此时所有节点分成以下几类:
1)还没被访问过的节点
2) 栈中比u早的节点(在u下方)
3) 栈中比u晚的节点(在u上方)
4) 栈中的u
5) 曾经入栈(访问过),又出了栈的节点
证明:
1):显然由u不可达。
2):由u不可达,因为DFN[u] = LOW[u]; u怎么转,能到达最早的点只有自己。
3):u可达此类节点,且这类节点可达u。
u可达此类节点是显然的。
证:此类节点可达u
若有此类节点x不可达u,首先不存在有向边(x->u),寻找x所能到达的最早的:
1.如果就是x,low[x]=dfn[x],则x应该已经被弹出栈了,这和x是第3类节点矛盾。
2.栈里面的节点y,则y必然比u晚,因为dfn[u]=low[u],u最早能到达的点为其本身,y比u早,则是y。而且有 low[y] = dfn[y](若此条不成立,则x还能到达比y更早的节点,矛盾)。而若 low[y] = dfn[y],则y应该已经被弹出栈了,y上方的x当然也已经不再栈中,这和x是第3类节点矛盾。
4):略。
5):这类节点不可达u
1.早于u遍历到,早于u的出栈即证明不可达u。
若可达的话,它此时应该还在栈里面,u的下面 —导致矛盾。
2.晚于u遍历到,任取节点x,假设x可达的最早节点是y,则y一定晚于u, 即 x不可达u. 任取节点x。x之所以已经被弹出栈,一定是 因为最终low[x] = dfn[x],或x位于某个y节点上方, 由y可达,且y满足条件:最终的 low[y] = dfn[y]。 因为y曾经出现在u的上方,所以y一定晚于u。因为 low[x]不可能小于等于dfn[u](否则low[y]就也会小于等于dfn[u],这和low[y]=dfn[y]矛盾),所以x到达不了u及比u早的节点。


That’s all, thanks!
推荐: Tarjan求桥和割点与双连通分量

Tarjan算法流程和简要证明相关推荐

  1. tarjan算法不是很懂先mark一下。

     前面为转载的.后面是自己的理解. 三种tarjan算法(上) .这篇算是做一个总结吧. 求强连通分量 求无向图的割和桥 最近公共祖先 求强连通分量 基本概念:       强连通是有向图才有的概念. ...

  2. 0x66.图论 - Tarjan算法与无向图连通性

    目录 一.无向图的割点与桥 割点 桥/割边 时间戳 搜索树 追溯值 二.割边判定法则 三.割点判定法则 1.luogu P3388 [模板]割点(割顶) 2.luogu P3469 [POI2008] ...

  3. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  4. Tarjan算法学习笔记

    一种由Robert Tarjan提出的求解有向图强连通分量的线性时间的算法. [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected ...

  5. 算法提高课-图论-有向图的强连通分量-AcWing 367. 学校网络:强连通分量、tarjan算法

    文章目录 题目解答 题目来源 题目解答 来源:acwing 分析: 第一问:通过tarjan算法求出强连通分量并且缩点后,统计入度为0的点的个数p即可. 第二问,至少加几条边才能使图变成强连通分量?这 ...

  6. 区块链共识算法Proof-of-Stake (PoS/权益证明) 常见问题解答 (1)

    Original post: https://github.com/ethereum/wiki/wiki/Proof-of-Stake-FAQ 什么是Proof-of-Stake 权益证明(PoS)是 ...

  7. 有向图强连通分量tarjan算法

    转自:http://www.byvoid.com/blog/scc-tarjan/ http://blog.csdn.net/geniusluzh/article/details/6601514 在有 ...

  8. Tarjan算法学习1-双连通

    太久不做题,发现很多学过的算法又通通不记得了,或许因为当时既没有深刻理解,也没有及时总结.最近开始复习图论,说是复习,不如说重新学习更加恰当.算法是进入大学紧跟着c语言接触到的第二项"技术& ...

  9. 【转】BYV--有向图强连通分量的Tarjan算法

    转自beyond the void 的博客: https://www.byvoid.com/zhs/blog/scc-tarjan 注:红色为标注部分 [有向图强连通分量] 在有向图G中,如果两个顶点 ...

最新文章

  1. jq的form data中保留加号_使用Fourier+EMD水管中传播的单频音波进行滤波(Python)...
  2. win10 java64虚拟机_Java VM 环境配置过程要点( win10,64位)
  3. python使用符号 表示单行注释-Python注释(多行注释和单行注释)用法详解
  4. 每天一记 10.01.27
  5. 修改文件后git只用两步push文件
  6. 数字后端——低功耗单元库
  7. arcgis栅格邻域统计_ArcGIS 从基础到实战书正式出版,易智瑞技术总裁沙志友沙总推荐并亲自写序...
  8. Spring3.1+Quertz1.8实现多个计划任务
  9. 【网摘】 浅谈HTTP中GET与POST的区别
  10. 揭秘成为最牛程序员的五大要诀
  11. 【深入理解JVM笔记】什么是元数据?
  12. 计算机基础知识测试试题及答案,计算机基础知识测试试题及答案
  13. 奔图打印机驱动linux安装方法,奔图3100打印机驱动
  14. Win11 安装 Linux 子系统
  15. 简单教会按关键字搜索商品
  16. ZZNU-正约数之和(DP)
  17. AppRTC服务器搭建
  18. matlab画时间 频率图,在matlab中画频数图和累积频率图
  19. 支付宝VR Pay,马云爸爸带来的又一个VR购物惊喜
  20. JVM的GC回收算法、GC收集器以及内存分配策略

热门文章

  1. Thingsboard之魔鬼编译,编译失败问题整理,ServerUI
  2. 2022年安全员-A证考题及在线模拟考试
  3. 【Nginx】Nginx配置实例-反向代理
  4. 正确处理时间和时区问题(java+mysql)
  5. 似然估计 Hessain Fisher Information
  6. 《Android 4高级编程(第3版)》(完整书签).pdf
  7. 车载以太网会是传统总线的末路吗?
  8. Tableau各版本更新情况
  9. JAVA基础数据类型转化
  10. Python绘制世界疫情地图