图论进阶总结 【第三部分 Tarjan与连通性】
图论进阶总结 【第三部分 Tarjan与连通性】
阅读之前,读者应该很清楚Tarjan算法的实现流程,故不赘述。
1.无向图连通性
在无向图连通性这一方面主要就研究这样几个对象:
- 连通块
这个可以使用并查集进行维护,不再多说
- 割边、割点、环、双连通分量
这些就要使用Tarjan算法来求解
所以Tarjan是一个解决这些问题的一个统一的方法,那么它是如何解决问题的?
Tarjan算法引入“时间戳”和”追溯值“的概念:
- 时间戳,即Tarjan算法访问节点的次序
这个次序实际上随着遍历顺序的不同会有改变,因此他具体的值可能并没有太大意义
实际上这个值就是一个区分子树内外,不难发现对于无向图而言,每一条非树边都从时间戳更大的点回到更小的点,而不可能反之。如果某一个从一个点通过了非树边,那它肯定可以到达子树外面。
- 追溯值
自然,追溯值就是至多通过一条非树边到达的最早访问的点
所以这是一个树形DP计算的过程。观察任何一个图例都可以发现,追溯值就是从这个子树出发可以到达的最早访问点。
那么,无论是割点还是割边,都是会把图分为几个部分的,不妨考虑在什么情况下才能把图分成几个部分:对于割边来说,如果其中一边的子树中有点可以到达子树外面,那么把这条边删了也不能分为两边;对于割点来说,如果子节点中的一个子树有点不可以到达子树外面,那么删除这个点至少可以将图分为两块。所以割边割点判定法则就诞生了。
不过让我们回到一切的源头,如果你面对这个问题,到底你为什么想到就是要用搜索树的性质?
科学研究的一般方法即从特殊到一般,特殊的结构就是树了,显然,上面每一条边都是割边。如果给上面再加边,就变成了一张图。为了判断这些边是否可以在删除某边/点的时候维持连通性,就需要判断这种边走向的点是在自己子树内还是外,就要明确的区分这两种点。搜索树,又是一种”不撞墙不回头的结构“,保证了时间戳的性质。
所以,有两种理解方式:
理解方式1: 利用非树边形成环,判定在环上的边不可能是桥(对于割点x,即满足任意一个子节点y都在一个简单环上的时候就判否)
理解方式2: 利用非树边到达子树外,判定子树内有点能到达子树外的就不是桥/割点
关于DCC,自不必说,这个已经明了了。
1.2 欧拉回路与欧拉路
欧拉回路判定定理:若一无向图存在欧拉回路,当且仅当无向图连通并且每个点的度是偶数
这是因为,如果每个点度都是偶数,这就说明如果进入一个节点就一定有尚未访问的边可以离开这个点。
2.有向图连通性
注意到在这里没有说什么割边、割点了,SCC的定义是可以互相到达,所以说求SCC的Tarjan算法就更加偏向我们上面第一种理解。当然,在一个联通的无向图里说互相到达那是没有意义的。所以有向图的Tarjan算法有些类似,又有些不同。
有向图的Tarjan算法就是尽量找到环(也可能是环套环)。因为有了更加强的限制,有向图Tarjan就是更加明确地找可以”返祖“的节点,然后更新追溯值。
还由于要求极大的连通子图,所以就要等到环的最上面的点再计算。
当然,求e-DCC也是可以这样操作的,加个栈就行了。
2.1 有向图的必经点与必经边
显然书上那个有向无环图求必经点、边的方法还比较好理解。
考虑必经点/边的特征:从原点到该点/边可能有许多条路径,而过后可能也有许多路径,这些很容易算出经过x的路径,然后加以对比。这是”同一法“。
2.2 2-SAT问题
之前在写并查集的时候我们说并查集是维护无向关系的,2-SAT却是一个有向关系。因为它里面的限制是”若ai=0/1或aj=0/1“,所以可以转换成"若ai不满足则aj必须满足"和”若aj不满足则ai必须满足“,这才是”原命题“、”逆否命题“,但是不能推出”若ai满足则aj必须满足/不满足“
所以条件其实要弱一点点,限制就要强一点。拆开每一个变量为2个点,分别连边。
这时候如果从a走得到b就说明由a可以推出b,其实这个是这样的逻辑。
但是如果由”a取值为1“可以推出”a取值为0“那么当然是错误的。
这个模型说明图就是来描述元素之间的影响,此处的元素即命题”ai=0/1“,运用”拆点“思想,这是一种图论建模里的常用思想。
要求解具体方案, 按照反Topo序进行确定。其实这里上面已经说过了A可达B其实指A蕴含B,所以按反Topo序中就是每次处理着没有蕴含关系、不会对其他SCC造成影响的SCC。
”确定“就是指如果选了一个SCC里的为答案。对应到一个变量的两种取值上,在反Topo序中越靠前,就会被确认为真。(显然,这其中任何一个变量的两个取值都肯定互相不可达,要不然必无解,请回顾我们上面说的逆否命题)
但是Tarjan在找LCA时是DFS过程,所以标号顺序就是反Topo序,故直接比较标号大小就简洁地解决了问题。
总结以上,Tarjan算法的基础用法就是:
-
查找图上的割点/割边/连通性
-
缩点
3.差分约束系统
其实差分约束和2-SAT还蛮像的,所以把它放到这里来了。
书上说其实把差分约束联系到最短路算法这里其实是因为式子”长得像“。好吧,”差分约束“即约束两个数之间差值的问题。
其实如果从比较形象的角度来理解,如果用点来表示变量,如同”差分约束“所示的那样,假如每一个
也就是说其实求出来的解应该是(在你连的0那几条边之下的)最大解。(要求大于0那几条边的最小解应该跑最长路)
所以捋一捋,你会发现图论建图是比DP建模还要难一点的东西。
有的时候出题人卡SPFA,此时可以缩点做DP。注意不是所有情况都可以。记住缩点的原则:环里的细节信息可被忽略。下面有这样的一个例题。
4.例题
其实0/1分数规划可以这样想,就是设一个mid,然后建立一个不等式
然后再化成大于小于0的形式就行了
这样逆向想比正着要好很多。
- P3275 [SCOI2011] 糖果 /368. 银河 - AcWing题库 0/1差分约束
显然是差分约束。这里求大于等于1的最小解,可以连完边跑最长路。
但是SPFA被卡了emm。注意到只有两种边权0/1,那么如果一个SCC上有1就是正环无解,所以合法方案的SCC都是0,可以忽略,考虑Tarjan缩点。缩完了按Topo顺序DP
这种区间问题有约束,通常化为前缀和解决。
但是前缀和差分约束需要多添加一些限制:
-
要保证前缀和单调不减
-
每个元素只能选择一次,最多贡献1
环上的点都不重要,重要的是从一个环是不是只有一种方法走到另一个,考虑缩点。
缩点之后考虑要加几条边,对于一棵树上的两个相邻点,如果中间只有1条边那么肯定是要加的。
第一篇题解说的十分精准,我没法再给出更好的描述了:
所以就是在点集内,若选择某个点则另外的点不能选;一条边上,若不选某个点,则另一个点必选。此时已经很显然了,2-SAT建边跑强连通分量判断是否矛盾
如果限制条件中元素可以分为两类,有选与不选的两状态,有关于选择的要求就可以转化为2-SAT
但是这样的话连边太多了,非常影响效率
可以发现覆盖边的选点是不能优化的,而覆盖集合的选点每一次都必须朝部分中其他所有另外的点连边,这太多了。所以考虑建立一个点来代表另外的结点,同时加另外的边维护限制条件,这样大大地提升了效率
遇到一个环显然可以重复地把环上蘑菇采完,所以环上信息可以忽略,考虑缩点。
考虑一个合法的方案需要:骑士之间有“不憎恨”的关系且是一个奇数环形
所以在不憎恨的骑士之间建边,这是可想而知的。
然后?DCC?其实一个DCC中可能不止是一个简单环
书上的证明略。所以为什么要用v-DCC?注意到v-DCC的充要条件:
里面每一个点都在一个不自交的环中。所以如果要判断有关简单环而不只是可达的条件,用vDCC会好一点
注意到一个环里的点一定是男女交替排列,边是主次交替的,说明必是偶环,并且,可以推得如果删除了某一条边还能完美匹配,那么这条边是“非主要”边,反之则是主要边。
为了快速得到简单环而不是DCC,我们将每条边转换为有向边:主要边从B到G,次要边反之。然后求SCC,即可区分简单环与DCC。
实在不行,可以考虑把合法情况分类讨论再手模然后找结论,这还是管用。
本文来自博客园,作者:haozexu,转载请注明原文链接:https://www.cnblogs.com/haozexu/p/18281762
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】