$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$的边成对存在的边,用类似网络流的搞下就成.

板子 $code$

无向图割点

若$x$不是根,则$x$是割点当且仅当搜索树上存在$x$的一个节点$y$满足$dfn_x\leq low_y$

若$x$是根,则$x$是割点当且仅当搜索树上存在两个像上面那样的点$y$

因为这里的条件是等号所以就不需要像前面那样还判些乱七八糟的东西辣$QwQ$

板子 $code$

无向图点双

和求割点类似,用个栈存着当前所有访问到的点,当有$dfn_x\leq low_y$的时候缩到一个点双中.

注意点双的定义与强联通分量不一样$QAQ$,就说点双是指的不存在割点的极大联通图.强联通分量是指的任意两点互相可达的极大联通图.

板子 $code$

无向图边双

和强联通分量求法是一样的,只是因为是无向边所以要注意别跑回父亲了,$over$

板子 $code$

有向图强联通分量

若在$x$回溯前有$dfn_x=low_x$,则栈中从$x$到栈顶的所有节点构成一个强联通分量.

板子 $code$

一个小变式 $code$

有向图必经点&有向图必经边

$QwQ$要用到支配树,,,?

告辞:)

随机推荐

  1. 算法导论笔记:18B树

    磁盘作为辅存,它的容量要比内存大得多,但是速度也要慢许多,下面就是磁盘的的结构图: 磁盘驱动器由一个或多个盘片组成,它们以固定的速度绕着主轴旋转,数据存储于盘片的表面,磁盘驱动器通过磁臂末尾的磁头来读 ...

  2. @atcoder - AGC040C@ Neither AB nor BA

    目录 @description@ @solution@ @accepted code@ @detail@ @description@ 给定偶数 N,求由 'A', 'B', 'C' 三种字符组成的字符 ...

  3. POJ2663 Tri Tiling

    思路: 设a[i]为N=i时的方法数.i为奇数的时候肯定为0. 如果i为偶数,a[i]可以看成a[i-2]加上两个单位组成的,此时多出来的2单位有3种方法. 也可以看成a[i-4]加上四个单位组成的, ...

  4. @loj - 2196@「SDOI2014」Lis

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定序列 A,序列中的每一项 Ai 有删除代价 Bi 和附加属性 ...

  5. AtCoder Regular Contest 060

    C - 高橋君とカード / Tak and Cards 思路:dp,先说说我想的,我写的dp数组是dp[i][j][k],表示从前i个数字中,选择j个数字,平均值为k,则dp[i][j][k] = d ...

  6. behavior planning——11 create a cost function speed penalty

    A  key part of getting transitions to happen when we want  them to is the design of reasonable cost ...

  7. oracle用UNION替换OR (适用于索引列)

    通常情况下, 用UNION替换WHERE子句中的OR将会起到较好的效果. 对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你 ...

  8. 史上最全的MYSQL备份方法

    本人曾经 用过的备份方式有:mysqldump.mysqlhotcopy.BACKUP TABLE .SELECT INTOOUTFILE,又或者备份二进制日志(binlog),还可以是直接拷贝数据文 ...

  9. @ENABLEWEBSECURITY和@ENABLEWEBMVCSECURITY有什么区别?

    @EnableWebSecurity和@EnableWebMvcSecurity有什么区别? @EnableWebSecurity JavaDoc文档: 将此注释添加到@Configuration类中 ...

  10. 【js】vue 2.5.1 源码学习 (十) $mount 挂载函数的实现

    大体思路(九) 本节内容: 1. $mount 挂载函数的实现. // 将Vue.prototype.$mount 缓存下来 ==>mountComponet(this,el) { // 组建挂 ...