Tarjan
1|0有向图
1|1搜索树
对有向图进行 时,递归经过的有向边形成的树,被称为搜索树。
树边:边 在搜索树中。
前向边:搜索树中存在一条 到 的路径。
后向边:搜索树中存在一条 到 的路径。
横叉边:搜索树中不存在 到 的路径和 到 的路径,且 。
1|2强连通分量
强连通图:在有向图中,对于每一对 , 都存在从 到 的路径和从 到 的路径,则该有向图为强连通图。
强连通分量:有向图中的极大强连通子图。
可以用 算法 来求有向图的强连通分量。
若点 为其所在的强连通分量在搜索树中第一个搜索到的点,称其为该强连通分量的根。
:点 的 序,即 中第一次搜索到点 的次序。
:在以点 为根的子树内的点通过非树边的一条边到达的 最小的节点 的 值, 能到达 。
:栈内元素为当前已访问过但没有判定为在某个强连通分量的点。
,表示点 是否在栈中,用来判定一条边是否为返祖边。
当点 满足 时,其为其所在的强连通分量的根。
当枚举点 的出边 时,若 为通过树边到达,则用 更新 ,若 为通过非树边到达,则用 更新 。
2|0无向图
2|1点双连通分量
割点:无向连通图中,如果将其中一个点以及所有连接该点的边去掉,图分裂为两个或两个以上的子图,则称该点为割点。
点双连通图:没有割点的无向连通图。
点连通分量:无向图中的极大点双连通子图。
选定一个根节点,从该根节点开始用 遍历整个图。
对于根节点,若其有两棵即以上的子树,则根节点为割点。因为如果去掉这个点,这两棵子树就不能互相到达。
对于非根节点 ,存在边 ,如果 ,则 为割点。因为从 到以 为根的子树之外的点都必须经过点 。
求割点时维护一个栈即可求出每个点双连通分量。
当 满足为割点时,就依次弹栈,直到弹出 就停止, 还需留在栈中,因为割点 可能属于多个点双连通分量。
2|2边双连通分量
桥:无向连通图中,如果一条边去掉,图分裂为两个子图,则称该边为桥。
边双连通图:没有桥的无向连通图。
边连通分量:无向图中的极大边双连通子图。
对于点 ,存在边 ,如果 ,则边 为桥。因为以 为根的子树内的点都必须经过边 。
记录入边 的作用是不处理儿子到父亲边,对于边 ,若处理了儿子到父亲边, 就会等于 ,将无法判定桥,记录具体是哪一条入边是为了处理重边的情况。
求出桥后即可求出边双连通分量。
给定一个无向连通图,至少添加多少条边可以把它变为边双连通图。
先对边双连通分量进行缩点,得到一棵无根树,设该树度数为 的节点个数为 ,则将该树变为边双连通图至少添加 条边。
在叶子节点带权下求出树的带权重心,然后将不同子树内的节点两两配对连边即可,因为一个子树内的叶子节点个数不超过 ,因此一定能匹配完后覆盖所有边。
__EOF__

本文链接:https://www.cnblogs.com/lhm-/p/12229463.html
关于博主:sjzez 的一名 OI 学生
版权声明:转载标明出处
声援博主:希望得到宝贵的建议
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现