[学习笔记]tarjan求割点

时间:2023-03-09 04:28:46
[学习笔记]tarjan求割点

都口胡了[学习笔记]tarjan求割点求割边,就顺便口胡[学习笔记]tarjan求割点求割点好了QAQ

[学习笔记]tarjan求割点的定义同[学习笔记]tarjan求割点求有向图强连通分量.

枚举当前点[学习笔记]tarjan求割点的所有邻接点[学习笔记]tarjan求割点:

1.如果某个邻接点[学习笔记]tarjan求割点未被访问过,则访问[学习笔记]tarjan求割点,并在回溯后更新[学习笔记]tarjan求割点

2.如果某个邻接点[学习笔记]tarjan求割点已被访问过,则更新[学习笔记]tarjan求割点

对于当前节点[学习笔记]tarjan求割点,

如果[学习笔记]tarjan求割点为搜索树中的根节点,若它的子节点数[学习笔记]tarjan求割点(根是多棵子树上节点的唯一连通方式),则[学习笔记]tarjan求割点为割点;

如果[学习笔记]tarjan求割点为搜索树上的非根节点,若存在子节点[学习笔记]tarjan求割点满足[学习笔记]tarjan求割点([学习笔记]tarjan求割点向上无法到达[学习笔记]tarjan求割点的祖先),则[学习笔记]tarjan求割点为割点.

inline void tarjan(int u,int fa){
dfn[u]=low[u]=++cnt;
for(int i=g[u];i;i=e[i].nxt){
++t[u];
if(!dfn[e[i].to]){
tarjan(e[i].to,u);
low[u]=min(low[u],low[e[i].to]);
if(u==1){
if(t[u]>=2) cut[u]=true;
}
else if(low[e[i].to]>=dfn[x]) cut[u]=true;
}
else if(e[i].to!=fa)
low[u]=min(low[u],dfn[e[i].to]);
}
}