关于tarjan缩点
  • 板块学术版
  • 楼主olegekei
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/2/13 19:24
  • 上次更新2023/10/24 00:52:36
查看原帖
关于tarjan缩点
593613
olegekei楼主2023/2/13 19:24

判断是否在栈中的vis数组是否可以省去,直接用缩点数组替代?如下代码:

int st[2000016],top=0;//栈
int scc[2000016],cnt=0;//缩点数组
int low[2000016],dfn[2000016],iindex=0;
void tarjan(int x){
	if(dfn[x])return;
    low[x]=dfn[x]=++iindex;
    st[++top]=x;//入栈时不再记录vis
    for(int i=head[x];i;i=e[i].nxt){
        int v=e[i].v;
        if(!dfn[v]){
			tarjan(v);
			low[x]=min(low[x],low[v]);
		}
        else if(!scc[v])low[x]=min(low[x],dfn[v]);//此处的if判断是否在栈中直接用缩点数组替代
    }
    if(low[x]==dfn[x]){
        int y;
		cnt++;
		while(y=st[top--]){
            scc[y]=cnt;
            if(x==y)break;
        }
    }
}

主要代码是中间的

if(!dfn[v]);//此处忽略
else if(!scc[v])low[x]=min(low[x],dfn[v]);
此处代替了vis数组

试了几组数据都没问题,【模板】缩点也能通过,这么写是否是正确的?

如果不正确的话求一个错误证明或hack数据

2023/2/13 19:24
加载中...