tarjan算法
zhangxuanrui0422 · · 个人记录
①所需要:
(1)low数组,dfn数组
——low[u]记录以u为根的子树中,不算u这个节点最高能跳到哪个节点
——dfn[u]记录u这个节点的编号
(2)存储方式(这里有两种)
——邻接表,即vector,显而易见
——链式前向星,比vector更省空间和时间
②tarjan主体(以这个节点为u为例)
(1)遍历子节点
(2)如果这个子节点没有被遍历过,tarjan(子节点)遍历,然后更新low[u],即low[u]=min(low[u],low[子节点])
(3)如果已经遍历过了,那也更新low[u],即low[u]=min(low[u],dfn[子节点])
③在进行tarjan操作时,可进行一些不影响tarjan遍历的操作,如用stack栈等等
④Code代码时间
void tarjan(int u){
dfn[u]=low[u]=++cnt;
bj[u]=1;
for(int i=0;i<v[u].size();i++){
int g=v[u][i];
if(!dfn[g]){
tarjan(g);
low[u]=min(low[u],low[g]);
}
else if(bj[g])
low[u]=min(low[u],dfn[g]);
}
}