首先我们需要搞懂图论中的一些基础概念
完全图: 假设一个图有 nnn 个顶点, 并且每两个点之间都有边就叫完全图
连通图(多指无向图): 对于两个点, u,v,u,v,u,v, 如果u,vu,vu,v 之间有通路,则称 u,vu,vu,v 两点连通, 如果图中任意两个点都连通, 则称这个图为连通图
连通分量: 连通分量中任意两点 u,v,u,v,u,v, 两两之间必定能互相到达, u−>v,v−>u.u->v, v->u.u−>v,v−>u. (当然一个点也是连通分量)
强连通分量: 极大的连通分量,对于连通分量内部的任意两个点 u,v,u, v,u,v,, 既存在 uuu 到 vvv 的路径, 又存在 vvv 到 uuu的路径,并且如果再加入其它点和边就不再连通的,


tarjan算法求强连通分量
了解 tarjantarjantarjan 算法之前你必须了解一个概念, 时间戳
时间戳: 根据深度优先搜索的顺序给节点标号
有了时间戳后我们就可以引入两个概念:
dfn[u]dfn[u]dfn[u]: 节点 uuu 所对应的时间戳
low[u]low[u]low[u]: 节点 uuu 所能够到达的时间戳的最小值
如果 dfn[u]==low[u]dfn[u] == low[u]dfn[u]==low[u] ⟺ \iff⟺ uuu 节点是所在强连通分量的最高点
判断一个点是否在某个强连通分量中 ⟺ \iff⟺ 该点是否能走到该强连通分量的最高点
tarjan 算法求强连通分量的步骤
- 缩点
- 建图
- 求拓扑序(递推)
1.缩点
void tarjan(int u)
{
dfn[u] = low[u] = ++ timestamp; //分配编号
s

338

被折叠的 条评论
为什么被折叠?



