有向图的强连通分量
定义:
给定一张有向图。若对于图中任意两个节点
如图,红色部分即为一个
Tarjan算法:
实现原理:
1. 处理参数:
对于每一个点
定义:
:遍历到点 时的时间戳 :点 可到达的 值最小的点
求出参数:
对该图进行一遍
在进行
遍历每个点的同时都将其压入栈中
对于
: 我们为每一个点 赋予一个时间戳(即 时的次序),并将其记录在 中
对
的值有两种情况: 假设点
的子节点为
- 当点
已经被遍历过时: 则判断 是否在栈中(是否为 所在的 的一部分)若在则将 更新为 (为了防止 将 连向 值较小的点) - 当点
未被遍历过时: 将 更新为
①横插边:对于图中的一条边
2. 找出SCC:
判定:
设当前遍历到点
证明:
当
这说明从点
而环一定满足
所以判定成立
Code:
1 | int n, m; |
在 main()
中要保证最后所有点的
所以有代码:
1 | for(int i = 1; i <= n; i ++ ) |
应用:缩点
定理:
由所有
而且
证明:
如图,分为两种情况讨论:
- 先遍历子图
: 这种情况一定会在某个地方断掉(如边 ),之后的 是该子图缩点后的祖先节点,满足定理 - 先遍历子图
: 这种情况会一次遍历所有点,该子图缩点后为之后的 的祖先节点,满足定理
所以定理成立
- 标题: 有向图的强连通分量
- 作者: firstlight
- 创建于 : 2024-03-13 18:55:36
- 更新于 : 2025-01-22 22:41:04
- 链接: https://blog.firstlightport.top/posts/scc/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论