Tarjan 算法总结
一些概念
连通:无向图中的任意两点都可以互相到达。
强连通:有向图中的任意两点都可以互相到达。
连通分量:无向图的极大连通子图。
强连通分量:有向图的极大强连通子图。
DFS 生成树:对一张图(有向无向均可)进行深度优先遍历得到的生成树。
树边:在 DFS 生成树上的边。
前向边:由子树的根连向子树内的非树边。
返祖边:由结点连向其祖先的边。
横叉边:除上面三种之外的边。
求强连通分量
对于结点 \(u\),记录两个信息 \(dfn_u\) 和 \(low_u\)。
\(dfn\) 表示时间戳,即第几个被遍历到的点。
\(low\) 表示从当前点开始,经过的边的两个端点均未处在已找出的强连通分量中,能到达最小的时间戳。
在 dfs 的过程中,将经过的点塞进一个栈里面。一旦发现 \(dfn_u=low_u\) 就一直弹栈直至弹出结点 \(u\),弹出的这些点就构成了一个强连通分量。
然后考虑如何求出 \(low_u\),枚举 \(u\) 的每条出边 \((u,v)\)。
结点 \(v\) 未遍历过,先递归处理该点,这样 \((u,v)\) 就成了树边,然后 \(low_u\gets\min(low_u,low_v)\)。
结点 \(v\) 已遍历过。
- 结点 \(v\) 处在一个已找出的强连通分量中,根据定义直接跳过。
- 结点 \(v\) 未处在已找出的强连通分量中,这样 \((u,v)\) 就成了非树边,同样地,\(low_u\gets\min(low_u,low_v)\)。
\(low\) 数组其实是在找一条向上的路径,而两个强连通分量是不可能有公共点的,所以我们才会有经过边的限制。
但是还有一个问题,\(low\) 数组有时会不能更新完全,怎么办呢?
按照边 \(1\to 2\to 3\to 4\to 5\to 6\) 的顺序走,仔细分析可以发现,\(low_3\) 没有更新完全的原因是 \(low_2\) 没有更新完全,而不是 \(low_3\gets \min(low_3,low_2)\) 导致的。
所以问题出在已遍历过的情况中。
但其实是没有关系的,\(low\) 数组的目的仅仅是判断当前强连通块是否能够继续向上合并。
所以可以在将 \(low_v\) 换成 \(dfn_v\)。
那么算法的正确性就很显然了,在合法的情况下(\(low\) 的定义)尽可能将当前强连通分量扩大。
Tarjan 算法总结的更多相关文章
- 有向图强连通分量的Tarjan算法
有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...
- 点/边 双连通分量---Tarjan算法
运用Tarjan算法,求解图的点/边双连通分量. 1.点双连通分量[块] 割点可以存在多个块中,每个块包含当前节点u,分量以边的形式输出比较有意义. typedef struct{ //栈结点结构 保 ...
- 割点和桥---Tarjan算法
使用Tarjan算法求解图的割点和桥. 1.割点 主要的算法结构就是DFS,一个点是割点,当且仅当以下两种情况: (1)该节点是根节点,且有两棵以上的子树; (2)该节 ...
- Tarjan算法---强联通分量
1.基础知识 在有向图G,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子 ...
- (转载)LCA问题的Tarjan算法
转载自:Click Here LCA问题(Lowest Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u, v)(通常查询数量较大),每次求树T中两 ...
- 强连通分量的Tarjan算法
资料参考 Tarjan算法寻找有向图的强连通分量 基于强联通的tarjan算法详解 有向图强连通分量的Tarjan算法 处理SCC(强连通分量问题)的Tarjan算法 强连通分量的三种算法分析 Tar ...
- [知识点]Tarjan算法
// 此博文为迁移而来,写于2015年4月14日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102vxnx.html UPD ...
- Tarjan 算法&模板
Tarjan 算法 一.算法简介 Tarjan 算法一种由Robert Tarjan提出的求解有向图强连通分量的算法,它能做到线性时间的复杂度. 我们定义: 如果两个顶点可以相互通达,则称两个顶点强连 ...
- 【小白入门向】tarjan算法+codevs1332上白泽慧音 题解报告
一.[前言]关于tarjan tarjan算法是由Robert Tarjan提出的求解有向图强连通分量的算法. 那么问题来了找蓝翔!(划掉)什么是强连通分量? 我们定义:如果两个顶点互相连通(即存在A ...
- 有向图强连通分量 Tarjan算法
[有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极 ...
随机推荐
- D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)
Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ...
- 解放双手,不写SQL!一个开源mybatis神器
什么是通用 Mapper? 它是一个可以方便的使用 Mybatis 进行单表的增删改查优秀开源产品.它使用拦截器来实现具体的执行 Sql,完全使用原生的 Mybatis 进行操作.在 Github 上 ...
- soloPi安装使用
SoloPi脚本转化器正式发布,支持转化为 Appium 与 Macaca 脚本:https://github.com/soloPi/SoloPi-Convertor,脚本转化器使用教程: https ...
- CSP-S 2020全国开放赛前冲刺模拟训练题1 T4 二维码
组合 首先可以考虑一个状态合法的条件,可以发现的是最后得到的矩阵一定是至少有一行或是有一列全$0$或$1$,如果把这一列或这一行删掉那么将剩下的子矩阵拼接起来又是一个子问题,同样的也是至少有一列或一行 ...
- mysql处理查询请求的步骤
服务端处理客户端的查询请求大致需要三个步骤: 连接管理 客户端连接服务端时,服务端会为其分配一个线程,客户端断开连接不会回收线程(避免频繁创建销毁的性能问题),服务端一直等待客户端发来消息(文本消息) ...
- mongoDB之C#and.net Driver
之前一直都是用NodeJS来连接操作mongoDB的,但是最近需要用C#操作mongoDB的需要,所以研究了下C#驱动.mongoDB官方在GitHub上提供了C#驱动源码https://github ...
- 【java】校验当前时间是否在规定的时间内
废话不多说直接贴代码. 我的日期格式是 8:00-22:00 要用的自己换下格式哈. public class CheckClosingTimeUtil { /** * 校验当前时间是否在规定时间内 ...
- 【转载】使用STM8SF103 ADC采样电压
源:使用STM8SF103 ADC采样电压 硬件环境: STM8SF103 TSSOP20封装 因为项目需要用到AD采样电池电压,于是便开始了使用STM8S ADC进行采样,也就有了下文. 手册上对S ...
- django环境安装操作整理!
1. Django 下载地址:https://www.djangoproject.com/download/ 注意:目前 Django 1.6.x 以上版本已经完全兼容 Python 3.x. 2.安 ...
- 各大数据库Java数据源参数
Sybase: driver=com.sybase.jdbc3.jdbc.SybDriver url=jdbc:sybase:Tds:172.22.12.212:5000/ctninfo user=s ...