专栏文章

tarjan算法

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mipt0c76
此快照首次捕获于
2025/12/03 17:27
3 个月前
此快照最后确认于
2025/12/03 17:27
3 个月前
查看原文

①所需要:

(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代码时间

CPP
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]);
	}
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...