$tarjan$简要学习笔记
$QwQ$因为$gql$的$tarjan$一直很差所以一直想着要写个学习笔记,,,咕了$inf$天之后终于还是写了嘻嘻.
首先说下几个重要数组的基本定义.
$dfn$太简单了不说$QwQ$
但是因为有向图无向图的$low$定义不一样,,,所以我我我我区分下两个$low$的定义,$QAQ$
有向图中的$low[x]:$在栈中且$x$的子树能到达的点.的$dfn$最小值
无向图中的$low[x]:$能通过一条不在搜索树上的边与$x$的子树中的点联通的点.的$dfn$最小值.
首先了解下$tarjan$的核心代码趴$QwQ$
if(x是y搜索树上的父亲)low[x]=min(low[x],low[y])
else low[x]=min(low[x],dfn[y])
不难理解?考虑$low_x$的定义是$x$及$x$的子树中能追溯到的$dfn$最小值.所以当$y$在$x$子树内时可以直接用$low$更新,否则就只能用$dfn$更新.
然后说下$tarjan$的几个基本应用
无向图割边
无向边$(x,y)$是桥,当且仅当搜索树上存在$x$的一个子节点$y$,满足$dfn[x]<low[y]$.
正确性显然不说.
注意因为这里的条件是小于号所以在更新$low[x]=min(low[x],dfn[y])$的时候要保证$y$不是$x$的父亲.
但是还有个要注意的在于如果有重边就不需要保证$y$不是$x$的父亲了,$QwQ$
这里解决办法是判断边$(x,y)$是不是就是和当前扩展到点$x$的边成对存在的边,用类似网络流的搞下就成.
无向图割点
若$x$不是根,则$x$是割点当且仅当搜索树上存在$x$的一个节点$y$满足$dfn_x\leq low_y$
若$x$是根,则$x$是割点当且仅当搜索树上存在两个像上面那样的点$y$
因为这里的条件是等号所以就不需要像前面那样还判些乱七八糟的东西辣$QwQ$
无向图点双
和求割点类似,用个栈存着当前所有访问到的点,当有$dfn_x\leq low_y$的时候缩到一个点双中.
注意点双的定义与强联通分量不一样$QAQ$,就说点双是指的不存在割点的极大联通图.强联通分量是指的任意两点互相可达的极大联通图.
板子 $code$
无向图边双
和强联通分量求法是一样的,只是因为是无向边所以要注意别跑回父亲了,$over$
板子 $code$
有向图强联通分量
若在$x$回溯前有$dfn_x=low_x$,则栈中从$x$到栈顶的所有节点构成一个强联通分量.
板子 $code$
一个小变式 $code$
有向图必经点&有向图必经边
$QwQ$要用到支配树,,,?
告辞:)
随机推荐
- @loj - 2090@ 「ZJOI2016」旅行者
目录 @description@ @solution@ @accepted code@ @details@ @description@ 小 Y 来到了一个新的城市旅行.她发现了这个城市的布局是网格状的 ...
- 自定义View系列教程07--详解ViewGroup分发Touch事件
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
- Java帮助文档打开索引就停止服务
cmd: regsvr32 jscript.dllregsvr32 hhctrl.ocxregsvr32 itss.dllregsvr32 itircl.dll
- iPython的安装过程
http://blog.csdn.net/u012587561/article/details/50900781 python2.7.10 amd64 win10 x64 1. 安装setuptool ...
- tensorflow入门——3解决问题——4让我们开始吧
深度学习适合解决海量数据和复杂问题 在机器学习中,语音识别,图像识别,语意识别用的是不同的技术,从事相关工作的人合作几乎不可能. 深度学习改变了这一切. 80年代计算机很慢,数据集很小,因此深度学习没 ...
- Android 自定义ProgressDialog
Android本身已经提供了ProgressDialog进度等待框,使用该Dialog,我们可以为用户提供更好的体验:在网络请求时,弹出此框等待网络数据. 不过,既然是为了提高用户体验,我们肯定希望该 ...
- Android Button点击效果(按钮背景变色、文字变色)
一. 说明 Android Button的使用过程中,我们会需要为Button添加点击效果,不仅仅按钮的背景色需要变化,而且有时,我们连文字的颜色都希望变化,我们可以使用StateListDrawab ...
- Activity学习(二):Activity的启动模式(转载)
在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作.在Android中Activity的启动模式决定了Activity的启动运行方式. An ...
- PHP 面试题二
1.抓取远程图片到本地,你会用什么函数? fsockopen, A 2.用最少的代码写一个求3值最大值的函数. function get_max($a,$b,$c) { return ($a > ...
- mybatis 一对多查询 集合创建空对象的问题
在做 mybatis 一对多查询的时候, resultMap 里面用到了集合标签 collection ,后来发现 当该条数据没有子集的时候, collection 会自动创建一个属性都是null的对 ...