刚刚看到 tarjan 模板题。
在 dfs 的过程中,有的题解在遍历到一个在栈里,已经被访问过的节点时,用 low 去更新 low,有的用 dfn 去更新 low。
就是:
inline void tarjan(int now)
{
int y; dfn[now] = low[now] = ++t , st[++top] = now , vis[now] = true;
for(int i = head[now];i;i = e[i].nxt)
if(!dfn[e[i].to]) tarjan(e[i].to) , low[now] = min(low[now] , low[e[i].to]);
else if(vis[e[i].to]) low[now] = min(low[now] , dfn[e[i].to]);
if(dfn[now] == low[now]) while(y = st[top--]) { dis[y] = now , vis[y] = false; if(y == now) break; a[now] += a[y]; }
}
与
inline void tarjan(int now)
{
int y; dfn[now] = low[now] = ++t , st[++top] = now , vis[now] = true;
for(int i = head[now];i;i = e[i].nxt)
if(!dfn[e[i].to]) tarjan(e[i].to) , low[now] = min(low[now] , low[e[i].to]);
else if(vis[e[i].to]) low[now] = min(low[now] , dfn[e[i].to]);
if(dfn[now] == low[now]) while(y = st[top--]) { dis[y] = now , vis[y] = false; if(y == now) break; a[now] += a[y]; }
}
这两种写法的不同,实际都能通过模板题。
所以哪种才是正确的,还是说两种都是正确的写法。