为什么tatjan求双连通要跳过反向边(个人理解)

菜鸡本鸡,理解了好长时间才想明白这个问题。现在看代码。

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又会重新改变(只是个人理解,如有错误,欢迎指教)

原创文章 38 获赞 7 访问量 1753

猜你喜欢

转载自blog.csdn.net/Alanrookie/article/details/105978758