正题

强联通分量

我们开两个数组 l o w , d f n low,dfn low,dfn 。 d f n dfn dfn 表示 i i i 点的 d f s dfs dfs 序, l o w low low 表示 i i i 点能到达的最小的 d f s dfs dfs 序。

有两个步骤:

若存在边 ( x , y ) (x,y) (x,y) ,且 y y y 未被遍历,那么遍历 y y y ,然后用 l o w [ y ] low[y] low[y] 更新 l o w [ x ] low[x] low[x] 。
若存在边 ( x , y ) (x,y) (x,y) ,且 y y y 在栈内,那么用 d f n [ y ] dfn[y] dfn[y] 更新 l o w [ x ] low[x] low[x]。

返回时,若 d f n [ x ] = l o w [ x ] dfn[x]=low[x] dfn[x]=low[x],那么说明当前能到达的最小 d f s dfs dfs 序就是本身,也就说明了一个新的强联通分量的产生。所以不断弹栈直到 x x x 即可。

有时候会发现,即使将第二个步骤中的 d f n [ y ] dfn[y] dfn[y] 写成 l o w [ y ] low[y] low[y] 仍然是正确的。
首先要理解当前在栈内的节点的对应子图一定是弱联通的。其次,在栈内,若 d f n [ y ] > d f n [ x ] dfn[y]>dfn[x] dfn[y]>dfn[x] 且存在边 ( x , y ) (x,y) (x,y),那么 y y y 必然是 x x x 的子孙。
所以当 d f n [ y ] > d f n [ x ] dfn[y]>dfn[x] dfn[y]>dfn[x] 的时候, l o w [ y ] low[y] low[y] 一定会通过步骤 1 1 1 来更新 l o w [ x ] low[x] low[x]。
当 d f n [ y ] < d f n [ x ] dfn[y]<dfn[x] dfn[y]<dfn[x] 的时候,到达 l o w [ x ] low[x] low[x] 的 路径是否只走一次向上的步骤已经无所谓了,因为并不影响答案。

割点

首先 d f s dfs dfs 树上一个点的两个子树没有一条直接边相连(也就是没有横叉边),否则在遍历第一个会直接遍历第二个子树。

割点在第二个步骤里面只可以用 d f n [ y ] dfn[y] dfn[y] 更新 l o w [ x ] low[x] low[x] ,因为此时的 l o w [ x ] low[x] low[x] 的定义发生改变,变为 d f s dfs dfs 到 x x x 的这条链上 x x x 能到达的最上面那个点(不走父边)。

对于一个点,如果有 d f s dfs dfs 树上 y y y 是 x x x 的儿子,而且 l o w [ y ] ≥ d f n [ x ] low[y]\geq dfn[x] low[y]≥dfn[x] ,那么说明 y y y 不能走到 x x x 的祖先去,也就说明了割掉 x x x ,会出现 y y y 这个联通块。

根要特殊判断,若根有两个 d f s dfs dfs 树上两个子节点,那么说明割掉根会形成两个联通块,那么根就是一个割点,否则不是。

点双联通分量

性质:
1.任意两点间至少存在两条点不重复的路径等价于图中删去任意一个点都不会改变图的连通性,即BCC中无割点
2.若 B C C BCC BCC 间有公共点,则公共点为原图的割点
3.无向连通图中割点一定属于至少两个 B C C BCC BCC ,非割点只属于一个 B C C BCC BCC

若存在树边 ( x , y ) (x,y) (x,y) , x x x 为 y y y 的父亲,且 l o w [ y ] ≥ d f n [ x ] low[y]\geq dfn[x] low[y]≥dfn[x] ,当前在栈内且比 y y y 高的节点与 x x x 形成了一个点双联通分量,因为这些节点不能到达比 x x x 的 d f n dfn dfn 更小的节点,同时,可以发现这些点形成的对应子图中不存在割点,否则已经被单独拿出来作为一个新的点双了。

还有要注意的是, x x x 点可能已经在一个更小标号的点双连通分量里面,所以,在弹出栈内的节点的时候只需要弹出到 y y y 点,而不是弹出到 x x x 点,因为这样会把更多的点弹掉。

最后在栈内的节点恰好是根节点。

割边

更新方法还是一样的。

根也不用特殊判断,若 ( x , y ) (x,y) (x,y) 是树枝边, l o w [ y ] > d f n [ x ] low[y]>dfn[x] low[y]>dfn[x] ,那么说明 y y y 子树内不可以到达 x x x 上面的点,说明 ( x , y ) (x,y) (x,y) 就是一条割边。

边双联通分量

我们把割边删除,然后直接 d f s dfs dfs 一遍,在一个连通分量里面的就是边双联通分量。

圆方树

在上面的点双连通分量里面我们已经知道了一个点可能在多个点双连通分量里面。

那么我们每一个点双连通分量新建一个方点,然后方点向那些在栈内里面的节点连边, x x x 向这个新建的节点连边,我们把原来的这些点称为圆点,那么容易发现圆点和方点是两两相间的,就形成了一棵圆方树,可以用这个东西在上面维护信息,特别是仙人掌。

强联通分量,双联通分量详解相关推荐

  1. 史上最强Dubbo面试28题答案详解:核心功能+服务治理+架构设计等

    1.Dubbo是什么? Dubbo 是一个分布式.高性能.透明化的 RPC 服务框架,提供服务自动注册.自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成. RPC 指的是远程调用协议, ...

  2. raid ahci模式哪个好_比群晖好用?威联通TR-004磁盘阵列外接盒使用详解

    之前,为了追求极佳的笔记本使用体验,笔者将笔记本自带的2T机械硬盘换成了一块容量为240GB的固态硬盘,读写效能确实快了不少,可随着笔记本安装的应用程序与存放的资料越来越多,笔记本能够提供的存储空间越 ...

  3. 联通无线网卡人工服务器,联通无线上网卡怎么用 联通无线上网卡使用步骤【详解】...

    [联通上网卡]联通无线上网卡怎么用 如何使用联通无线上网卡 联通无线上网卡业务功能 1.提供高速无线上网服务:无线上网卡仅在开通3G网络的区域使用,不能切换到2G网络使用: 2.上网卡使用专属号码,上 ...

  4. Windows XP硬盘安装Ubuntu 12.04双系统图文详解

    按照下文的方法,自己在winXP上面装Ubuntu12.04双系统,准确说是winXP+win7+Ubuntu三系统:正在安装,稍后将自己安装截图发出来.. 修改计算机名: sudo gedit /e ...

  5. php语言中双引号的作用是什么,php中的单引号与双引号作用详解

    一.引号定义字符串 在Php中,通常一个字符串被定义在一对引号中,如: 'I am a string in single quotes' "I am a string in double q ...

  6. swift 中的 感叹号 问号 和 双问号用法详解

    首先介绍一下swift 中的 Optional!  点到 Optional 的头文件可以看到, Optional 其实是个enum,里面有 case None 和 case Some(Wrapped) ...

  7. Win7下U盘安装Ubuntu14.04双系统步骤详解 | 浏览:42144 | 更新:2014-05-24 18:09 | 标

    参考网站https://jingyan.baidu.com/article/76a7e409bea83efc3b6e1507.html 笔者由于工作需要使用LINUX系统,之前通过Win7上的VM虚拟 ...

  8. Grafana使用双Y坐标轴详解

    最近在给公司做Grafana的监控图表,在一个显示错误数的面板这卡住了.想在一个面板同时显示RPC调用的成功次数和失败次数,不过因为失败次数和成功的次数远不在一个数量级,所以想着分两个Y轴来表示,左边 ...

  9. 印度乘法口诀双位数乘法详解

    近日来,网上流传着一个"印度乘法口诀".和我们中国的乘法表不同,这个乘法表延伸到19以内,即所谓"19*19"乘法表.尽管其难度比"九九乘法表&quo ...

  10. vue项目中使用可选链 ( ?. )和双问号 ( ??)详解

    1.安装插件:@babel/plugin-proposal-optional-chaining npm install --save-dev @babel/plugin-proposal-option ...

最新文章

  1. Syncfusion教程:在Xamarin.Forms中创建数据输入表单 (3)
  2. AMD宣布350亿美元收购赛灵思,CPU、GPU、FPGA全凑齐,中国握有否决权
  3. Ionic 标签中添加单击事件 、双击事件
  4. 在DataGrid中选择,确认,删除多行复选框列表
  5. 蓝桥杯 基础练习 时间转换
  6. java判断字符串是否包含日文
  7. ❤️一分钟学会python条件语句❤️
  8. php 多个files 数量,php – 具有多个字段时$_FILES数组的奇怪格式
  9. 由一维数组表示的N维数组实现(C++)
  10. Caused by: java.lang.NoSuchMethodException: init [class android.content.Context, interface andr解决
  11. 2017百度之星程序设计大赛 - 资格赛
  12. HTML5页面如何在手机端浏览器调用相机、相册功能
  13. 计算机技术在中医领域的应用,计算机技术在中医药领域的应用概况.doc
  14. STM32MP157移植Qt5.12.10
  15. 色度抽样(4:2:0)到底是什么意思?
  16. 【verbs】ibv_create_cq()
  17. 尚学堂Struts视频总结之一
  18. 面试总结-----工程化软件项目开发的流程、步骤
  19. intouch实时报警
  20. 理解 Hexdump

热门文章

  1. 电脑26个英文字母按键紊乱解决方案
  2. nginx域名隐性(地址栏域名不变)跳转【nginx 跳转 隐藏 被跳转的域名】
  3. STM32串口通信USART练习
  4. mysql 5.6 开启gtid_MySQL 5.6 GTID 原理以及使用
  5. IIS应用程序池总是关闭问题
  6. 封装详解,private,修改私有属性get/set方法,类和对象总结
  7. pandas基本功能
  8. 苹果应用加急审核操作流程
  9. matlab 变压器 异名,Matlab simulink变压器的配置
  10. springboot使用多线程处理高并发接口