Tarjan再学习
蓝书的那一套理论比较生硬,且不是很深刻,故重学Tarjan。AlexWei《图论Ⅰ》
相关定义#
割点:在无向图中,删去使得连通分量数增加的点被称为割点。
割边:在无向图中,删去使得连通分量数增加的边被称为割边。
点双连通图:不存在割点的无向图。
边双连通图:不存在割边的无向图。
点双连通分量:一张图的极大点双连通子图称为点双连通分量(V-BCC),简称点双。
边双连通分量:一张图的极大边双连通子图称为边双连通分量(E-BCC),简称边双。
缩点:把一个连通分量等价为一个点的操作。边双和点双缩点后均得到一棵树,而强连通分量缩点后得到一张DAG。
基本性质#
边双连通#
考虑割边两侧的两个点
两点之间的所有必经边,就是连接它们所有迹的交。
在研究必经边时,重复经过一条边是不优的,所以只需考虑两点之间的迹(路径边集不重复)。
不难发现,割边和必经边的概念是完全等价的。
断开一条割边会使连通块数 +1。断开所有割边,每个连通块中不含割边且不能再扩大,是原图的边双连通分量。
这说明边双连通分量由割边连接,边双缩点得到一颗树,每条边都是原图割边。
任意添加一条边
传递性:若
证明:
结论:边双的点集两两无交,每个点恰属于一个边双,根据传递性易证。
结论:对于边双内任意一条边
证明:考虑边
点双连通#
与边双不同,两个点双可能有交,例如 "8字形",中间的交点在两个点双都出现了。
因此点双不具有传递性。但如果两个点双有交,交点一定唯一,否则两个点双可以合并。
结论:若两点双有交,那么交点一定是割点。如果删去交点后两点双仍然连通,则可以合并。
引理:若两点点双连通,那么包含这两点的点双唯一。不唯一则出现两个交点,矛盾。
现在已经知道点双交点是割点,那么割点一定是点双交点吗?删去割点,考虑割点的两个邻居
根据定义,
结论:一个点是割点当且仅当属于超过一个点双(上面充分性和必要性都有证明)。
结论:由一条边直接相连的两点点双连通。
推论:一条边恰属于一个点双。
正如割边是连接边双的「桥梁」,割点也是连接点双的桥梁。
用一个点代表一个点双,并将这个代表点向与之相连的割点连边,得到块割树。
考虑删去点双中的一个点
如果度数大于
若度数等于
如果
结论:对于
Tarjan求割点#
无向图DFS树
给定无向连通图
无向图 DFS 树的性质:
- 祖先后代性:任意非树边两端具有祖先后代关系。
- 子树独立性:节点的每个儿子的子树之间没有边(和上一条性质等价)。
- 时间戳区间性:子树时间戳为一段连续区间。
- 时间戳单调性:节点的时间戳小于其子树内的时间戳。
后两点比较显然,证一下前两点,对于
非根节点的割点判定
记
设
删掉
由于
条件等价于任意
如果
设
所以
进一步的,由于
因此,如果
设
如果存在
否则删掉
得到非根节点的割点判定法则:如果存在儿子
设 low
数组的真正含义):
当且仅当存在
根据上述 DP 的定义,
根的割点判定法则
若
如果
割边求法#
Tarjan#
探究
树边使整张图连通,割断非树边不影响连通性,因此
不妨设
这说明
如果存在
割边判定法则:对于树边
树上差分#
已经知道树边是割边的一个必要条件。
如果存在非树边
怎么刻画一条树边有没有被非树边覆盖?把边
边双连通分量缩点#
由于每个点恰属于一个边双,把每个割边割断后剩下的每个连通块都是一个边双。
可以先 Tarjan 给所有割边打上标记,再 dfs 找连通分量,但太麻烦。
考虑原图的的 DFS 树,找到当前深度最深的一条割边
把
最后栈内剩下一些点,组成一个包含根结点的边双,不要忘记弹出。
如果图中存在环,这个环一定要缩成一个点。重边也可以规约为两条边的环。
不妨先用最小花费使整张图无环。如果
因此把
不会出现把
缩完点后得到一张森林,其中每棵树是独立的,最后把主链首尾相连即可。
对于一棵树,假如已经确定了主链,现在要在主链上挂尽可能多的点。
对于主链的一个分支,显然存在祖先后代关系的点不能同时挂在主链上,那么最优方案就是选该分支的所有叶子。
设整棵树有
操作次数为
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现