Tarjan缩点/边双/点双

文章目录

    • 代码实现
    • 实际应用
      • 1.有向图
      • 另外:对于缩点之后的DAG的处理
      • 2.无向图
      • 求法
        • 细节
        • 细节:
    • 目录:
    • 1.「POJ 3694」Network
    • 2.「2019 ICPC 横滨站」
    • 3. P3225 [HNOI2012]矿场搭建
    • 4. 一本通 分离的路径

代码实现

所以其实就三个玩意
1.dfn[],low[],indx
2.stack<int>s,bool pd[]
3.scc[],scnt,col[]等我们要求的信息变量名 				用处
dfn          	记录当前已经访问了几个节点
scc		 	    记录当前已经有了几个强连通分量
dfn[ maxn ] 	当前节点是第几个被访问到的
low[ maxn ] 	当前节点所能访问到的最小的 dfn[ ]
scc[ maxn ] 	记录各个节点所属于的强连通分量编号
s[ maxn ] 		存储可能构成强连通分量的节点的栈
top 			存储栈顶      

那么我们如果要求scc这样一个东西,应该是用什么结构呢?
思想其实并不是很难,就是我们要求SCC,将它放入dfs序中,发现它有一定的特点,那就是在搜索树中的点,一定可以通向祖先,那他们就是一个scc,因为他们可以彼此到达。

所以我们要找最大的scc,那么就是要求出最小的祖先。
所以每个节点不用存下所有祖先,而只用存这一个就够了。
所以有了low[]来存x的搜索树内边和最小的点。

那么肯定是要dfs的。

发现low[]=min(low[son]),min(dfn[to]);

所以dfs回溯递归处理,该问题具有自相似性。

实际应用

可以分为两类

1.有向图

缩点之后变成了一个DAG,那么什么时候应该缩点呢,
例子:

  1. “喜欢”是可以传递的——如果A喜欢B,B喜欢C,那么A也喜欢C

  2. 一旦我们逮捕了一个间谍,他手中掌握的情报都将归我们所有,这样就有可能逮捕新的间谍,掌握新的情报。

  3. 给定一个 n 个点 m 条边有向图,每个点有一个权值,求一条路径,使路径经过的点权值之和最大,允许多次通过同一个点和边。

  4. 从S到T,可以重复走,求所有路径中点权最大值与最小值的差。

  5. P1407 我们已知n对夫妻的婚姻状况,称第i对夫妻的男方为Bi,女方为Gi。若某男Bi与某女Gj曾经交往过(无论是大学,高中,亦或是幼儿园阶段,i≠j),则当某方与其配偶(即Bi与Gi或Bj与Gj)感情出现问题时,他们有私奔的可能性。不妨设Bi和其配偶Gi感情不和,于是Bi和Gj旧情复燃,进而Bj因被戴绿帽而感到不爽,联系上了他的初恋情人Gk……一串串的离婚事件像多米诺骨牌一般接踵而至。若在Bi和Gi离婚的前提下,这2n个人最终依然能够结合成n对情侣,那么我们称婚姻i为不安全的,否则婚姻i就是安全的。

给定所需信息,你的任务是判断每对婚姻是否安全。

总结 :可以重复走,有传递性(即一个接一个)

另外:对于缩点之后的DAG的处理

1.DAG 一定存在一个或多个入度为0或出度为0的点。

2.可以进行拓扑排序,排序靠后的点不可能到达靠前的点。

3.DAG上的DP(期望等)

4.把入度为0的点与出度为0的点之间连边,会变成一个SCC

2.无向图

点双连通:删去任何一个点仍然连通边双连通:删去任何一条边仍然连通

(下面会简称为“点双和边双”)

另一种定义是,任何两点之间至少存在两条不经过相同中间点(边)的路径

如果不满足双连通性

割点(割顶):删去后原图不连通的顶点集合点双连通:删去任何一个点仍然连通边双连通:删去任何一条边仍然连通割边(桥):删去后原图不连通的边集合
  1. 边双连通分量:删去所有割边,每个连通块都是边双连通分量
  2. 一张图的点双连通分量之间可能有公共点,边双连通分量之间不可能有公共点(否则他们整体可以构成一个边双)
  3. 满足点(边)双连通性的极大子图称为点(边)双连通分量
  4. 如果一条边左边是一个最大的边双连通子图(边双),右边是另一个最大的边双连通子图(边双),那么这个边就是没有用的,删去,这样剩下的就是边双了
  5. 点双与割点可能会有公共点。点双和点双之间可能会有公共点
  6. 割边的两端大多数情况下是割点,除了一边只有一个点的情况

求法

  1. 割边
  • 不需要用到栈,因为不用存储强连通分量。
  • 割边一定存在于树边上,否则存在另一条路径。
  • 注意low的定义有所变化,有向图中low只代表能到达的在栈中的节点的最小值。但在无向图中,没有栈的限制。
  • dfn[u]<low[v]那么(u,v)即为割边

细节

  • 注意这里变成了严格小于,因为我们限制了指向父亲的边,那么若low等于dfn的话相当于存在一条回路。
  • 但是要进行特判不能让出去的点再次走同一个无向边,否则low[to]必定等于dfn[x],没有意义了,但是还要允许重边访问,所以我们应该记录边的编号。
  1. 割点
  • 对于搜索树中的根节点,儿子数大于等于2即为割点。
  • 对于一般点:dfn[u]<=low[v]那么u就是割点
  • 但是注意割边两边一般是割点,但是特殊情况下一边只有一个点,那就不是割点了。

细节:

  • 引入了rt,son每次tarjan都要重新赋值。
  • 小心pd[]=true,cnt++;这样的语句,因为bool值本来可能已赋值过了。
  • 分类讨论!!!不要忘了。

目录:

  1. 「POJ 3694」Network
    • 边双缩点变成树,在线查询两点之间边的个数,然后再一次缩点。
  2. 「2019 ICPC 横滨站」
    • 边双在指定无向边的方向之后一定可以变成强连通分量。
  3. P3225 [HNOI2012]矿场搭建

1.「POJ 3694」Network

在线查询一个无向图,加入一条边后减少了多少条桥。

2.「2019 ICPC 横滨站」

给出一些起点和终点,判定把无向边确定方向之后能否满足每一个起点都可以走到对应的终点。

3. P3225 [HNOI2012]矿场搭建

题意:对于一个矿场可视作无向图,现在已知任意矿场塌陷后,每一个点可以从出口逃出,那么最少在图上建立几个出口及方案数。
那么可以发现删去一个点对于点双仍然联通,所以dfs每一个点双,统计点双中有多少割点。

可以发现,如果将点双视为点,那么图会变成一个树,如果断掉一个割点,相当于断裂一条边,所以只要在叶子节点上建立就可以了。

  • 若没有割点则建立一个,方案数为节点数。
  • 若有一个割点则需要建立一个在非割点上,方案数为非割点的数目。
  • 若有两个割点则不需要建立。

4. 一本通 分离的路径

给出一个无向连通图,现在求出使每个点到其他点都有两条完全不同的路径最少还需要添加几条边。

可以发现这就是一个边双,那么对边双缩点,图会变成一个树,那么只要给两个叶子节点连边再缩点,就可以使新的树叶子数减少二,所以共用(sum-1)/2。

注意各个题解都没有注意到的是,如果两个普通两个叶子相连只能减少一个叶子,因为如果他们的lca有两个儿子就会在他们的lca处新增一个叶子。所对叶子节点的选取是有要求的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314190.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「LibreOJ Round #11」Misaka Network 与求和(杜教筛 + Min_25)

#572. 「LibreOJ Round #11」Misaka Network 与求和 推式子 ∑i1n∑j1nf(gcd(i,j))k∑d1nf(d)k∑i1nd∑j1nd[gcd(i,j)1]∑d1nf(d)k∑K1ndμ(k)(nKd)2tKd∑t1n(nt)2∑d∣tf(d)kμ(td)我们记f(x)kF(x)上面式子后半部分是一个迪利克雷卷积形式:F∗μ所以我们卷上一个I&#xff0c…

学习笔记之12个月提升计划

Java世界博大精深&#xff0c;有太多的东西要学。如果一头扎进去&#xff0c;很可能会淹没在Java技术的海洋里。于是&#xff0c;最近一直在思考列一个提纲&#xff0c;作为高级工程师到资深、再到架构之路的路标。 学习笔记一栏&#xff0c;即为本计划的博客记录。将自己的计划…

从“梁漱溟:思考问题有八层境界”所联想到的

最近一段时间以来写的文章比较少了&#xff0c;这固然是有一些客观原因&#xff0c;但确实有我不可说的一些自我反省和认识等主观因素。记得8月初有一次友人聚餐&#xff0c;席间有朋友聊到公众号的运营心得体会&#xff0c;其中有一条是&#xff1a;避免粉丝减少的黄金法则之一…

P4126 [AHOI2009]最小割(网络流/最小割)

P4126 [AHOI2009]最小割 https://www.cnblogs.com/dugudashen/p/6228304.html 求解一张有向图中关于最小割的可行边和必须边&#xff0c;可行边定义为存在一种最小割包含这条边&#xff0c;必须边定义为任意一种最小割包含这条边。 可行边的条件&#xff1a; 满流对于边<…

vagrant 环境配置

vagrant是简便虚拟机操作的一个软件&#xff0c;而使用虚拟机有几个好处&#xff1a; 1、为了开发环境与生产环境一致&#xff08;很多开发环境为windows而生产环境为linux&#xff09;&#xff0c;不至于出现在开发环境正常而移步到正式生产环境时出现各种问题&#xff0c;而…

与Min_25筛有关的一些模板

模板 求∑i1nf(i),f(pk)pk(pk−1)\sum \limits_{i 1} ^{n} f(i), f(p ^ k) p ^ k \times(p ^ k - 1)i1∑n​f(i),f(pk)pk(pk−1)&#xff0c;最后对mod1e97\bmod 1e9 7mod1e97&#xff0c;这个函数是个积性函数。 /*Author : lifehappy */ #pragma GCC optimize(2) #pragm…

P4897 【模板】最小割树(Gomory-Hu Tree)(网络流/最小割/树形结构)

P4897 【模板】最小割树&#xff08;Gomory-Hu Tree&#xff09; 这个算法可以用来求解一个无向图上任意两点的最小割&#xff0c;具体过程就是每次选择两个点求最小割&#xff0c;然后在一个新图中这两个点连边&#xff0c;然后对于这两个点的连通块分别递归处理&#xff0c;…

程序员过关斩将--cookie和session的关系其实很简单

喜欢就点关注吧!月高风下&#xff0c;下班路上....菜菜哥&#xff0c;告诉你一个秘密&#xff0c;但是不允许告诉任何人这么秘密&#xff0c;你有男票了&#xff1f;~不是&#xff0c;昨天我偷偷去面试了&#xff0c;结果挂了这不是好事吗&#xff0c;上天让公司留住你.....好吧…

Georgia and Bob(Poj 1704)Nim 博弈

Georgia and Bob 思路 每个棋子只能向左移动并且不能越过其左边的棋子&#xff0c;这就有点像是经典的nim博弈了&#xff0c; 但是在这里后一个石子会受到其前一个石子位置的影响&#xff0c;这里就需要转化一下了。 我们假设只有两个棋子&#xff0c;x,y,x>0,y>xx, …

.NET导出Excel的四种方法及评测

前言导出Excel是.NET的常见需求&#xff0c;开源社区、市场上&#xff0c;都提供了不少各式各样的Excel操作相关包。本文&#xff0c;我将使用NPOI、EPPlus、OpenXML、Aspose.Cells四个市面上常见的库&#xff0c;各完成一个导出Excel示例。然后对其代码风格和性能做一个横向比…

[2021.1.27多校省选模拟10]染色(min-max容斥/二项式反演)

[2021.1.27多校省选模拟10]染色 突然发现我对概率期望的理解不是很好。。。 部分分1&#xff1a;可以直接进行状压dp&#xff0c;然后按照题意模拟即可。 部分分2&#xff1a;首先可以发现这个问题是min_max容斥形式&#xff0c;然后对于min(T)的问题&#xff0c;我们将问题转…

1847 奇怪的数学题(杜教筛 + Min_25 + 第二类斯特林数)

1847 奇怪的数学题 推式子 ∑i1n∑j1nsgcd(i,j)k∑d1nsgcd(d)k∑i1nd∑j1nd[gcd(i,j)1]∑d1nsgcd(d)k(2∑i1ndϕ(i)−1)\sum_{i 1} ^{n} \sum_{j 1} ^{n} sgcd(i, j) ^k\\ \sum_{d 1} ^{n} sgcd(d) ^k \sum_{i 1} ^{\frac{n}{d}} \sum_{j 1} ^{\frac{n}{d}} [gcd(i, j) …

[2021.1.27多校省选模拟10]跑步(线段树合并)

[2021.1.27多校省选模拟10]跑步 经典的树上启发式合并题目&#xff0c;维护对应子树的从当前点到子树内一个节点这个链待定&#xff0c;其他部分已经确定的方案数&#xff0c;这个东西按照对应点到根节点的路径点权和为下标存在一个权值线段树中&#xff0c;然后维护这个权值线…

ASP.NET Core 双因素验证2FA 实战经验分享

必读本文源码核心逻辑使用AspNetCore.Totp&#xff0c;为什么不使用AspNetCore.Totp而是使用源码封装后面将会说明。为了防止不提供原网址的转载&#xff0c;特在这里加上原文链接&#xff1a;双因素认证双因素身份认证就是通过你所知道再加上你所能拥有的这二个要素组合到一起…

银行卡BIN码大全

BIN号即银行标识代码的英文缩写。BIN由6位数字表示&#xff0c;出现在卡号的前6位&#xff0c;由国际标准化组织(ISO)分配给各从事跨行转接交换的银行卡组织。银行卡的卡号是标识发卡机构和持卡人信息的号码&#xff0c;由以下三部分组成&#xff1a;发卡行标识代码(BIN号)、发…

HDU 1404 Digital Deletions(博弈 + SG函数打表)

Digital Deletions 思路 一道博弈论的题目&#xff0c;考虑到题目所给的范围是字符长度为1−>61-> 61−>6&#xff0c;所以我们可以考虑暴力打表出10610 ^ 6106内的所有状态&#xff0c; 确定基本的两个状态sg[0]1[先手胜],sg[1]0[后手胜]sg[0] 1[先手胜], sg[1] …

cjy基础动态规划

cjy基础动态规划 P2219 [HAOI2007]修筑绿化带 对于一个nm的矩形空间内&#xff0c;然后选择一个ab的矩形加上它所在部分的权值&#xff0c;然后在内部再选择一个c*d的矩形&#xff0c;然后减去它的权值和&#xff0c;求解最大的权值。 首先我们可以通过枚举求得所有右下角对…

Be the Winner(结论:反nim博弈)

Be the Winner 结论 记一个结论&#xff1a;反nim博弈&#xff0c;先手必胜1&#xff1a;尼姆和为零&#xff0c;所有值为1。2&#xff1a;尼姆和不为零&#xff0c;有一个大于1的数。 代码 /*Author : lifehappy */ #pragma GCC optimize(2) #pragma GCC optimize(3) #inc…

结合“性能监视器” 排查、处理性能瓶颈导致应用吞吐率等指标上不去的问题...

双11备战前夕&#xff0c;总绕不过性能压测环节&#xff0c;TPS 一直上不去 / 不达标&#xff0c;除了代码上的问题外&#xff0c;服务器环境、配置、网络、磁盘、CPU 亦是导致性能瓶颈的重要一环&#xff0c;本文旨在分享最近项目性能压测过程中的排查经验&#xff0c;文中的表…