有向图注意v在栈中时,才用dfn更新low。无向图不用判断这个。
SCC和边双,都是在返回时判断low==dfn。
点双就是找割点,low(v)>=dfn(u)时,把tarjan(v)过程中放入栈的点以及u加入点双。
一个点可能位于多个点双。
割点为>=,割边为> 。
点双要特判根。
圆方树圆圆边就是割边。
圆方树要把边开够(n×2+m×4)。
仙人掌通常变为圆方树处理。
仙人掌的圆圆边不用求割边。直接添加没有被返祖边覆盖的即可。
如果要求出所有经过了其中一个点的环,可以不用圆方树。
直接vector记录一个点在哪些环中即可。
如果要求出所有经过了其中一条边的环,最好使用圆方树,方点就是经过的环。
因为一个点可能在多个环中。
例题: