$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. 64位Linux编译C代码,crt1.o文件格式不对的问题

    今天在某台64位LInux下编译一个简单的hello world的C程序,报错: /usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../crt1.o: cou ...

  2. Vue.js 第1章 Vue常用指令学习

    今日目标 能够写出第一个vue应用程序 能够接受为什么需要学vue 能够使用指令 能够通过指定完成简单的业务(增加删除查询) 能够理解mvvm 为什么要学习vue 企业需要 可以提高开发效率 实现vu ...

  3. shell爬虫

    #!/bin/bash curl_str='curl -x "http://http-pro.abuyun.com:9010" --proxy-basic --proxy-user ...

  4. SuperSocket性能数据采集的应用程序接口的改动

    性能数据采集的应用程序接口作了修改,两个虚方法已经被更改: protected virtual void UpdateServerSummary(ServerSummary serverSummary ...

  5. Google Colab使用教程

    简介Google Colaboratory是谷歌开放的云服务平台,提供免费的CPU.GPU和TPU服务器. 目前深度学习在图像和文本上的应用越来越多,不断有新的模型.新的算法获得更好的效果,然而,一方 ...

  6. H3C DCC概念

  7. 条件随机场(CRF) - 4 - 学习方法和预测算法(维特比算法)

    声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,由于本人在学习初始时有很多数学知识都已忘记,所以为了 ...

  8. PyTorch中view的用法

    相当于numpy中resize()的功能,但是用法可能不太一样. 我的理解是: 把原先tensor中的数据按照行优先的顺序排成一个一维的数据(这里应该是因为要求地址是连续存储的),然后按照参数组合成其 ...

  9. H3C 显示RIP当前运行状态及配置信息

  10. 21个项目玩转深度学习:基于TensorFlow的实践详解06—人脸检测和识别——项目集锦

    摘自:https://github.com/azuredsky/mtcnn-2 mtcnn - Multi-task CNN library language dependencies comment ...