菜鸡本鸡,理解了好长时间才想明白这个问题。现在看代码。
void tarjan(int u,int pre)
{
dfn[u]=low[u]=++cnt;
for(int i=head[u];i;i=edge[i].next){
int v=edge[i].v,id=edge[i].id;
if(!dfn[v]){ //还没访问过
tarjan(v,id);
low[u]=min(low[u],low[v]);
}
else if(pre!=id) //重点说一下这里为什么要跳过反向边
low[u]=min(low[u],dfn[v]);
}
}
其实很简单,如果我遍历子节点的时候如果通过反向边又回到了父节点,那么在进入tarjan函数的时候父节点的dfn和low又会重新改变(只是个人理解,如有错误,欢迎指教)