[ARC092F] Two Faced Edges 题解
题意
给定一张有向图,询问将每条有向边反向过后整个图的强连通分量的个数是否发生改变。
数据范围:\(n\le 1000,m\le 200000\)。
思路
分类讨论,讨论强连通分量是增加了还是减少了,假设修改的边是 \(u\to v\)。
- 强连通分量减少
因为只修改了一条边,所以强连通分量减少的情况肯定是 \(u,v\) 原本在不同的强连通分量中,修改边过后两个强连通分量合并为一个了,那么修改前需要满足:
-
\(v\) 不能走到 \(u\)。
-
\(u\) 到 \(v\) 的路径不只有 \(u\to v\) 这一种,即 \(u\) 到 \(v\) 的路径不一定经过 \(u\to v\) 这条边。
- 强连通分量增加
因为只修改了一条边,所以强连通分量增增加的情况肯定是 \(u,v\) 原本在相同的强连通分量中,修改边过后两个强连通分量分为两个了,那么修改前需要满足:
-
\(v\) 能走到 \(u\)。
-
\(u\) 到 \(v\) 的路径只有 \(u\to v\) 这一种,即 \(u\) 到 \(v\) 的路径一定经过 \(u\to v\) 这条边。
把强连通分量的两种变化的条件结合起来,发现是刚好相反的,所以我们可以分别记录 \(u\) 能 / 不能走到 \(v\), \(u\) 走到 \(v\) 的路径一定 / 不一定经过 \(u \to v\)。对于第一个,直接在每个点上跑一遍 \(dfs\) 看能走到哪些点即可。对于第二个,先正序枚举点 \(u\) 的出边,对于每一个点 \(v\) 记录一下自己是从哪条出边到的,然后再倒序枚举点 \(u\) 的出边,对于每一个点 \(v\) 也记录一下自己是从哪条出边到的。如果两次的边是一样的,说明 \(u\) 到 \(v\) 的路径一定经过 \(u\to v\) 这条边;否则说明 \(u\) 到 \(v\) 的路径不一定经过 \(u\to v\) 这条边。
因为强连通分量如果要改变的话必须满足且仅满足一个条件,所以最终答案异或一下即可。
每次对于每一个点 \(u\) 都进行了一遍 \(dfs\),时间复杂度 \(O(nm)\)。