设 num[i] 为访问 i 节点 的 dfs 序,bool 变量 vis[i] 表示 i 节点是否被访问过了。 现有一条有向边 ( u, v)。
若 num[v] > num[u],则边 ( u, v ) 为树枝边或前向边
- 若 vis[v] == false,则该边为树枝边
- 若 vis[v] == true,则该边为前向边
若 num[v] < num[u],则边 ( u, v ) 为后向边或横叉边
这时需从节点 u 开始往前回溯 (在dfs时处理出来一个 father[i] 数组),看是否能回溯到 v 点
- 若点 v 是点 u 的祖先(即可以回溯到),则该边为横叉边
- 若点 v 不是点 u 的祖先,则该边为横叉边
参考:深度优先生成树及其应用 —— llhthinker (博客)