liyixin0514 @ 2024-11-29 15:55:16
如下是 tarjan 求强连通分量的代码,其中 else 部分 low[u]=min(low[u],dfn[v]);
写成 low[u]=min(low[u],low[v]);
也可以过。请问这两种写法都正确吗?蒟蒻刚学图论 1ms,能否解释一下语句的含义?
void tarjan(int u) {
dfn[u]=low[u]=++dfn0;
st[++top]=u;
for(int v : to[u]) {
if(!dfn[v]) {
tarjan(v);
low[u]=min(low[u],low[v]);
}else if(!num[v]) {
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u]) {
num[u]=++cnt, scc[cnt].push_back(u);
while(st[top]!=u) scc[cnt].push_back(st[top]), num[st[top]]=cnt, --top;
--top;
}
}
by liyixin0514 @ 2024-11-29 16:00:22
如果说根据 OI Wiki,
by Ask_sum @ 2024-11-29 16:12:42
如果是有向图求 SCC 的话,那这两句都是对的,但是别的连通性问题用
by chaeminter2467 @ 2024-11-29 16:15:20
@liyixin0514 在求强连通分量中两种写法都是正确的,原因是最后这些点都会缩成一个大点,也就是它们的low
是一致的。而在使用Tarjan求其他的东西的时候应该注意使用dfn[v]
。
我个人认为,low[i]
指的就是通过非生成树树边回溯到的最高级的祖先,因为Tarjan的底层其实是使用了生成树的逻辑。
可以去看一下tarjan求点双连通分量和边双连通分量的板子,可以帮助理解。
有歧义的地方欢迎询问 qwq
by GalenoJiao @ 2024-11-29 16:16:45
@liyixin0514
我们老师说的是写成
从含义上看
by chaeminter2467 @ 2024-11-29 16:17:25
边双 可以看看这个!!!
by chlchl @ 2024-11-29 16:22:00
@liyixin0514 根据定义来说,else
的时候
by liyixin0514 @ 2024-11-29 16:29:53
大概理解了,谢谢各位大佬/bx
by guoguo160 @ 2024-12-13 23:24:48
%%%%%%