判断是否在栈中的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数据