强连通
作者:@魔幻世界魔幻人生
本文为作者原创,转载请注明出处:https://www.cnblogs.com/subtlemaple/p/16340032.html
首先我们引入定义:
1、有向图G中,以顶点v为起点的弧的数目称为v的出度,记做deg+(v);以顶点v为终点的弧的数目称为v的入度,记做deg-(v)。
2、如果在有向图G中,有一条<u,v>有向道路,则v称为u可达的,或者说,从u可达v。
4、如果有向图G不是强连通图,他的子图G2是强连通图,点v属于G2,任意包含v的强连通子图也是G2的子图,则乘G2是有向图G的极大强连通子图,也称强连通分量。
5、什么是强连通?强连通其实就是指图中有两点u,v。使得能够找到有向路径从u到v并且也能够找到有向路径从v到u,则称u,v是强连通的。 ------转自csdn
个人理解:强连通图是指一个任意两节点 u,v 可互相到达的图,强连通分量就是一个图的强连通子图
上图就有三个强连通分量,下面我们将用Tarjan算法找出:
割点
若从图中删除节点 x 以及所有与 x 关联的边之后,图将被分成两个或两个以上的不相连的子图,那么称 x 为图的割点。
桥
若从图中删除边 e 之后,图将分裂成两个不相连的子图,那么称 e 为图的桥或割边。
Tarjan算法
发明者神中神,这里不多提
算法流程
1.使用dfs,从任意节点开始深度搜索,给每个节点按顺序标号 (dfn[u]=++cnt)
dfs
时规定:1)dfn[]
为节点标号 , vis[]
记录节点是否已经经过,
2)low[]
若 dfs
u\to v ,则 dfs
回溯时 low[u]=min(low[u],low[v])
,初始化low[u]=dfn[u]
,从 u \to v 时先判断 v 是否已经过。若已走过,则直接刷新 low[u]
不dfs
,否则,先继续 dfs
, 回溯时再刷新 low[u]
2.我们能发现,强连通图必定成环,则环内每一点都的 low
都能在回溯时被环中最小的 dfn
刷新,则 low[u]==dfn[u]
时,u 就是该强连通图的一个点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】