双极定向构造
可以先求出一个合法拓补序,再考虑每条边的方向。
跑一遍 tarjan,求出每个点的 \(dfn\) 和 \(low\)。 考虑一个二度点,一定是一进一出。对于每个点可以只保留连向 \(low\) 的返祖边,那么叶子一定是二度点,可以把叶子剥掉,直到只剩 \(s\to t\) 的路径。剥叶子的实现可以将 \(u\) 的 \(fa_u\) 和 \(low_u\) 的后继列表,按照 \(s\to t\) 的顺序染黑 \(s\to t\) 路径上的点,当一个点被染黑,那么遍历它的后继列表,将它们也染黑,即 dfs。
为什么是对的?因为一当 \(fa_u\) 和 \(low_u\) 其中之一被染黑,\(u\) 就会被染黑,那么 \(u\) 的拓补序就在它们之间,满足一进一出。

浙公网安备 33010602011771号