关于Tarjan(1)

众所周知,

求有向图的强连通分量的Tarjan算法是以其发明者Robert Tarjan命名的。Robert Tarjan还发明了求双连通分量的Tarjan算法,以及求最近公共祖先(LCA)的离线Tarjan算法,在此对Tarjan表示崇高的敬意。

这里只对求割点进行代码剖析。

所以

上板子

void tarjan(int now){//now当前节点 
	int num1=0;//dfn为时间戳,low为时间戳最小的祖先 
	dfn[now]=low[now]=++num; 
	vis[now]=true;
	for(int i=head[now];i;i=edge[i].nxt){//利用链式前向星依次访问临边 
			int to=edge[i].to;
			if(!vis[to]){
				fa[to]=now;tarjan(to);//记录父亲,深搜 
				low[now]=min(low[to],low[now]);//更新low值 
				if(dfn[now]<=low[to])num1++;//儿子能到达祖先,不是割点 
				//反之,是割点 
			}
			else
			if(fa[now]!=to)low[now]=min(low[now],dfn[to]);
			// 也有更新low值的作用 
        }  
	if(now==1&&num1>1)ans[++ans[0]]=now;//根节点要special judge,至少2个 
	if(now!=1&&num1)ans[++ans[0]]=now; // 记录割点 
}
其实很简单~~~~

感谢姓徐的撑船的人~~~~~

转载于:https://www.cnblogs.com/zzmmm/p/6501185.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值