Mnzn询问
  • 板块灌水区
  • 楼主AC47
  • 当前回复12
  • 已保存回复12
  • 发布时间2022/3/3 09:13
  • 上次更新2023/10/28 07:24:27
查看原帖
Mnzn询问
545364
AC47楼主2022/3/3 09:13

刚刚看到 tarjan\text{tarjan} 模板题。

dfs\text{dfs} 的过程中,有的题解在遍历到一个在栈里,已经被访问过的节点时,用 low\text{low} 去更新 low\text{low},有的用 dfn\text{dfn} 去更新 low\text{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]; }
}

这两种写法的不同,实际都能通过模板题。

所以哪种才是正确的,还是说两种都是正确的写法。

2022/3/3 09:13
加载中...