【知识】Tarjan求强连通分量,对四种边的理解

【step1】画出搜索树。

【step2】在树上补上指向染色过点的边(打上叉,记作打叉边)

【setp3】看搜索树理解四种边的概念,并记住low计算公式

1)树枝边——搜索树上的所有边, 对于边(u,v),有low[u]=min{low[u],low[v]}。

2)前向边——打叉边中起点u指向某个祖先节点v的边,不用计算low值。

3)后向边——打叉边中起点u指向某个子孙v的边,有low[u]=min{low[u],dfn[v]}。

4)横叉边——打叉边中起点u指向另一分枝v的边,有low[u]=min{low[u],dfn[v]},强调说明:4)中的v即不是u的子孙,也不是u的祖先。

void Tarjan(int u){//Tarjan求SCC 
	dfn[u]=low[u]=++num;//num表示时间戳的序号
	stack[++top]=u;
	for(int i=head[u];i;i=next[i]){
		int v=to[i];
		if(!dfn[v]){//点v还不有入栈
			Tarjan(v);
			low[u]=min(low[u],low[v]);//(u,v)树枝边 
		}
		else if(!co[v])//(u,v)后向边或横叉边,且点v没有出栈
				low[u]=min(low[u],dfn[v]);
	}
	if(low[u]==dfn[u]){
		co[u]=++col;//染色,SCC内的点都标为col 
		++si[col];//统计当前SCC中的结点数 
		while(st[top]!=u){
            co[st[top]]=col;
			++si[col];
			--top;
		}
		--top;//满足stack[top]=u的SCC的根u,出栈 
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值