例题:洛谷P4716
算法流程详见oi.wiki
自己感觉比较好的一篇题解
讲讲自己不太明白的地方
1.代码40行和42行的判断条件
for(u=i;u!=r&&top[u]!=i&&!id[u];u=fa[u]) top[u]=i;
和
if(u!=r&&!id[u]) { id[u]=++cnt;for(int v=fa[u];v!=u;v=fa[v]) id[v]=cnt;
}
第一个判断条件是说如果当前点①不是根节点(是根节点就不能再往下了,根节点没有入边),②没被当前\(i\)走到过(走到过即同一次中(从\(i\))走到过这一次又走到这一次,走了一个环),③\(u\)没有包含于任何一个环中(很简单,已经在环里了还做什么)。
第二个判断条件是说如果当前点满足上述①③,一定是不满足上述②而退出的,而②代表的就是有环。
说到这,我觉得我不是很认同题解中对\(top_i\)的定义,我认为按上述我的解释,\(top_u\)代表的应该是\(u\)最新是从谁走过来的。