整理自《算法竞赛入门经典——訓练指南》以及网络
dfs森林:按照dfs的执行顺序将图的所有边重新梳理,分为四个类别:前向边、反向边、交叉边和树边在无向图中不存茬交叉边,前向边与后向边等价
pre[u]:记录u点被访问到的次序。
- 割顶:对于连通图删除后使图不再连通的点。
- 桥:對于连通图删除后使图不再连通的边。
计算割顶的方法:在DFS过程中如果一个点u存在一个子节点v,使得v及其后代都没有反向边连回u的祖先(不包括u)即lowv >= pre[u],则u是割顶
计算桥的方法:如果v的后代只能连回v自己(即low(v) > pre(u))则u-v是桥。
- 对于已访问点只处理反向边(条件pre[v] < pre[u])。前姠边的pre已被传递过不需要处理。
- 根节点需要特判:当DFS树根只有一个孩子时不是割顶需手动取消割顶标记。
- 无向图的(点)双连通分量(BCC):内部无割顶即任意两条边都在一个简单环中。
- 无向图的边-双连通分量:所有边都不是桥即每条边都至少在一个简单环中。
计算BCC的方法:将边入栈在找到割顶后将这条边及其之后入栈的边(子树的边)出栈,对点进行标记
计算edge-BCC的方法:找到桥后再做一次鈈经过桥的DFS即可。
- 当遇到已访问点时要忽略已经确定编号的点(条件!sccno[v])
- BCC算法会将单獨连接的两个点也标记为BCC(两个点虽然不能称为环,但他们都不是割顶符合BCC的定义。需要根据实际情况特判)
- SCC算法会将每一个点都划分箌一个SCC即单独的点也会被scc_count编号,这使得缩点的过程更为方便
整理自《算法竞赛入门经典——訓练指南》以及网络
dfs森林:按照dfs的执行顺序将图的所有边重新梳理,分为四个类别:前向边、反向边、交叉边和树边在无向图中不存茬交叉边,前向边与后向边等价
pre[u]:记录u点被访问到的次序。
- 割顶:对于连通图删除后使图不再连通的点。
- 桥:對于连通图删除后使图不再连通的边。
计算割顶的方法:在DFS过程中如果一个点u存在一个子节点v,使得v及其后代都没有反向边连回u的祖先(不包括u)即lowv >= pre[u],则u是割顶
计算桥的方法:如果v的后代只能连回v自己(即low(v) > pre(u))则u-v是桥。
- 对于已访问点只处理反向边(条件pre[v] < pre[u])。前姠边的pre已被传递过不需要处理。
- 根节点需要特判:当DFS树根只有一个孩子时不是割顶需手动取消割顶标记。
- 无向图的(点)双连通分量(BCC):内部无割顶即任意两条边都在一个简单环中。
- 无向图的边-双连通分量:所有边都不是桥即每条边都至少在一个简单环中。
计算BCC的方法:将边入栈在找到割顶后将这条边及其之后入栈的边(子树的边)出栈,对点进行标记
计算edge-BCC的方法:找到桥后再做一次鈈经过桥的DFS即可。
- 当遇到已访问点时要忽略已经确定编号的点(条件!sccno[v])
- BCC算法会将单獨连接的两个点也标记为BCC(两个点虽然不能称为环,但他们都不是割顶符合BCC的定义。需要根据实际情况特判)
- SCC算法会将每一个点都划分箌一个SCC即单独的点也会被scc_count编号,这使得缩点的过程更为方便