首页 > 其他分享 >Tarjan 求双连通分量(点双连通分量、边双连通分量)

Tarjan 求双连通分量(点双连通分量、边双连通分量)

时间:2024-04-09 20:45:05浏览次数:11  
标签:连通 双中 mathit Tarjan 割点 分量

注意:本文只针对无向图。

对于无向图,显然不能只考虑简单的连通关系,应该研究一些更强的连通关系:双连通。

前置芝士

  • 点双连通分量:若一个连通分量任意两点间 都存在 至少两条不经过(除起点和终点外)相同点的路径,我们就称这个连通分量 为点双连通分量。
  • 边双连通分量:同理,若一个连通分量任意两点间 都存在 至少两条不经过 相同边的路径,我们就称这个连通分量 为边双连通分量。
  • Tarjan 求割点和桥

首先要明确的是,若一点(或边)对于原图是割点(或桥),对于其任意包含该点(或边)的子图,该点(或边)仍是割点(或桥)。

可以想到,在一张无向图的点双连通分量中,一个割点所连的点有且只有 \(1\) 个(注意这个点必须是指定点双连通分量中的)。注意不是度数为 \(1\),因为可能有重边。原因是若某割点连接了一点双连通分量中的两个点,必然有删去它后该点双连通分量不连通。反之它就不是割点。

同样的,在一张无向图的边双连通分量中,必然不包含桥。

Tarjan 求点双连通分量

算法流程

首先维护一个栈 \(\mathit{stk}\),一访问点 \(u\),就将 \(u\) 压入 \(\mathit{stk}\)。

书接上回,当判断一点是割点后,我们可以从 \(\mathit{stk}\) 中退点,将这些点加入新的点双中,一直退到 \(v\),注意不要退出 \(u\),但要在当前点双中加入 \(u\)。

因为上文说了,虽在一个点双中,割点连接的点只有 \(1\) 个,即 \(v\),但 \(u\) 还可能在其他点双中,故不能退栈(或者你退完压回去也可以)。

所以注意,不同于强连通分量和接下来要说的边双,一个点可能在多个点双中。

进一步的,我们甚至可以求出删去 \(u\) 后连通分量的增加个数,记为 \(cut_u\)。每当满足 \(\mathit{low}_v\ge \mathit{dfn}_u\),\(cut_u\gets cut_u+1\)。因为一旦删去 \(u\),\(v\) 将与 \(u\) 的祖先脱离联系,导致连通分量数量增加 \(1\)。

其他与求割点相同。

代码

暂无。

Tarjan 求边双连通分量

算法流程

还是同样的维护 \(\mathit{stk}\),当判定边 \((u,v)\) 为桥后,可将 \(stk\) 退到 \(v\),并将退的点加入一个新的边双中。有没有发现边双比点双简单多了?是的,由于桥不能存在于边双中,故退到 \(v\) 即可,没有太多可叽叽歪歪的。

其他与求桥相同。

代码

暂无。

完结撒花!

Tarjan 连通系列正式完结啦!(除了代码)

以后可能还会更 LCA、LCT、splay 的文章(挖大坑)。

标签:连通,双中,mathit,Tarjan,割点,分量
From: https://www.cnblogs.com/chargedcreeper/p/18124673/tarjan-bcc

相关文章

  • 连通性+ 1
    早在普及组的时候,我们就学会了:DFS(BFS)搜连通块并查集在加边的情况下动态维护连通块(支持离线处理删边)现在,我问你:我删去一个点/边,判断剩下的图存在原本某两个连通的点现在不连通?我随机删去一条边,判断剩下的图中某两个点是否一定连通?我随机给你一些点,判断其中两两是......
  • 边双连通分量
    边双连通分量我们令双连通表示两个节点之间段开一条边还是连通的。边双连通分量表示求出几个最大的点集,使得任意一个点集中点两两双连通。例题luoguP8436方法1我们发现,如果两个节点原先连通但不是双连通,肯定他们之间的路径是经过某一座桥,所以可以求出来桥,把桥拆......
  • tarjan
    桥定义:删除这条边后连通块数量加1思考先暴力搜出一棵树,然后对于每一条非树边都会构成一个环,这个环上的边就不可能是桥了(拿样例来看)\(1\rightarrow2\)和\(5\rightarrow6\)就是桥假如用\(lca\)来维护加一个树上差分码量就有点惊人了考虑优化如果搜树的顺序改为\(df......
  • 聚水潭与金蝶云星空对接集成退货退款查询连通[聚水潭][销售退货单标准新增]-v1(聚水潭
    聚水潭与金蝶云星空对接集成退货退款查询连通[聚水潭][销售退货单标准新增]-v1(聚水潭--销售退货对接-P-12495392-这个店铺的数据)接入系统:聚水潭聚水潭是SaaS协同平台、电商ERP软件。聚水潭成立于2014年,创始人兼CEO骆海东拥有近三十年传统及电商ERP的研发和实施部署经验。......
  • [转]Docker 两个不同网络间实现连通
    原文地址:Docker两个不同网络间实现连通-西瓜君~-博客园一、启动不同网络的容器1、启动两个bridge(自带默认)桥接的容器[root@yang~]#dockerrun-it--nametomcat1tomcat[root@yang~]#dockerrun-it--nametomcat2tomcat#查看容器[root@yang~]#dockerps......
  • Tarjan板子
    Tarjan画图必备强连通分量(有向边)常见题建好有向图找强连通分量,同时记录每个强连通分量中节点的个数找节点个数最小的强连通分量点击查看代码structEdge{ intto,next;}edge[N];voidadd(intu,intv){ edge[++cnt].to=v; edge[cnt].next=head[u]; head[u]=cnt;......
  • Tarjan 算法——图论学习笔记
    Part.1引入在图论问题中,我们经常去研究一些连通性问题,比如:有向图的联通性:传递闭包——Floyd算法;有向图连通性的对称性:强联通分量(SCC)——Tarjan算法缩点;无向图的联通性:并查集;无向图的关键边:桥(割边)、边双——Tarjan算法缩点;无向图的关键点:割点、点双——Tarjan建立圆方......
  • Python环境下一种改进小波分解方法-用于多分量信号的分解
    小波通俗的讲就是一种振幅表现为在正负之间震荡的波形。小波变换在基于短时傅立叶变换的前提下,又加入了其所没有的可随频率变化的“时间-频率”窗口,其能对时间、频率进行局部化分析,并且对待处理信号通过多尺度处理使其表现为时-频细分的特点,是一种能突出信号时频特点以及细节的......
  • 强连通分量随记随忘
    vis用于判断某个点是否在栈中tot表示强连通分量的数量belong[x]表示点x所属的强连通分量all[]与tot变量相关,表示此强连通分量的点的数量outd[]与tot变量相关,表示此强连通分量的出度模板代码如下:#include<bits/stdc++.h>usingnamespacestd;constintN=1e4+5;intn,m,......
  • 太阳之华 连通块计数
    C-太阳之华_牛客小白月赛89(nowcoder.com)思路:可以发现,最多经过一次操作就能知道结果:全是蓝色:蓝方胜全是红色:红方胜红方经过一次操作:存在一个连通块扩散等于蓝色个数:红方胜否则,红蓝一直重复进行,平局因此,对棋盘进行一次遍历,将所有红色连通块全部找出来并记上标记(类......