总结-tarjan

主要是总结一些问题和细节处理。

有向图

  1. 强联通分量缩点之后是【DAG】不是【树】,在缩点之后的图上干事情记得记忆化

  2. 有向图 tarjan 在非树边时可以写:low[x]=min(low[x],dfn[y]) 也可以写 low[x]=min(low[x],low[y]),这里的 \(low\) 数组只是起一个标记是否能追溯的作用。

无向图-边双

  1. 缩点后是【树】。

  2. 这时候也可以写 low[x]=min(low[x],low[y]),因为删边只会影响一条边。

  3. 搜索树的时候通常都会判不走父亲,但是边双不一样,有重边和没有重边不一样,所以只是不能走来时的边,但不是不能回父亲,所以使用链式前向星,并且 \(cnt\) 从 2 开始比较方便。

  4. 判断割边时是 low[y]>dfn[x]

无向图-点双

  1. 无法正常缩点,可以重构圆方树。

  2. 这时候 \(low\) 数组的定义必须是只走一次非树边到达的点,必须写 low[x]=min(low[x],dfn[y]),因为点删除后其所连得所有边都删除,\(x\) 子树中的点无法通过 \(x\) 所连返祖边追溯。

  3. 与割边不同,判断割点时是 low[y]>=dfn[x]

  4. 计算割点时需要特判根节点,因为其 \(dfn\) 为 1,所有的 \(low\) 全部大于等于他,非割点的根会被误判成割点。

  5. 计算点双不需要特判根,但需要特判单个点。

  6. 一个点可能属于多个点双。

  7. 与点双和强联通分量不同,计算点双必须要在循环内,并且由于割点 \(x\) 可能需要多次利用,所以不同点双中其他点一起出栈。

  8. 一条边只会属于一个点双,所以两个点双的交集最多只会有一个点。

圆方树

  1. 是【树】!可以树剖,LCA,DP……

  2. 圆方树中的非叶子圆点是割点。

  3. 空间要开两倍!

分层图

  1. 空间开 \(n\times k\)

  2. 分层图两种方式,在 \(dis\) 数组中开二维 or 直接把 \(n\times k\) 的图建出来。

posted on 2026-06-05 20:36  fish2012  阅读(6)  评论(0)    收藏  举报