Taijin

1|0定义

1|1无向图

给定无向连通图 G=(V,E)

若对于 xV,从图中删去节点 x 以及所有与 x 相连的边之后,G 分裂成两个或以上不相连的子图,则称 xG割点

若对于 eE,从图中边 e 之后,G 分裂成两个不相连的子图,则称 eG割边

没有割点的无向连通图称为“点双连通图”。没有桥的无向连通图称为“边双连通图”。

无向图的极大点双连通子图被称为“点双连通分量”(v-DCC),无向图的极大边双连通子图被称为“边双连通分量”(e-DCC)。二者统称为“双连通分量”(DCC)。

dfnx 表示 x 的 dfs 序。

lowx 表示 x 的子树中只经过一条边所到达的节点 dfn 的最小值。

1|2有向图

2|0Tarjin 算法

2|1求强连通分量

dfnx=lowx 时弹栈。
缩完点后是 DAG(有向无环图)。

2|2求割点

x 为割点的充要条件是:

  • x 不为搜索树的根节点,存在 x 的一个子节点 y,满足dfnxlowy
  • x 为搜索树的根节点,存在至少 2x 的子节点满足上述条件

2|3求桥

无向边 (x,y) 是桥的充要条件是搜索树上存在 x 的一个子节点 y 满足 dfnx<lowy

2|4求点双连通分量

  1. 当一个节点第一次访问时,把它入栈。
  2. 当存在 x 的子节点 y 满足 dfnxlowy,无论下 x 是否为根,弹出栈内节点直到 y 被弹出,刚才弹出的所有结点和 x 构成的 v-DCC。
    缩完点后可以构造出圆方树。

2|5求边双连通分量

两种方法:

(1)把所有桥删去,跑连通块。

(2)每次把当前节点入栈。遍历完 x 后,若 dfnx=lowx,弹出栈内元素直到 x 被弹出,刚才弹出的所有结点构成一个 e-DCC。

缩完点后是一个树。

3|0易错点

  1. 求 e-DCC 时不用判重边自环,但要判断父节点的反边。求 v-DCC 时要判自环,否则判孤立点时会出问题(似乎可以在判孤立点时判断,但输入时判断更简便),不用判重边和父节点。

  2. 求 v-DCC 时满足 dfnxlowy 时即可输出点双联通分量。求割点时当 x 为根节点时,至少要有 2y 满足条件

  3. 多测时清空 dfn 数组。

  4. 求删去一个点后会多出几个连通块时,答案不是这个点是否时割点,而是这个点被多少个 v-DCC 所包含(再减一)。


__EOF__

本文作者louisliang
本文链接https://www.cnblogs.com/louisliang/articles/17943614.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   louisliang  阅读(25)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示