我们有一个 𝑁 行 𝑁 列的矩阵。第 𝑖 行第 𝑗 列的格子表示为 (𝑖,𝑗)。
开始时,有 𝑀 个格子是黑色,其他格子都是白色。特别地,开始时格子 (𝑎1,𝑏1),(𝑎2,𝑏2),⋯,(𝑎𝑀,𝑏𝑀) 是黑色。
スヌケ君会按照以下的规则尽可能多的将白色格子涂成黑色:
- 对于整数 1≤𝑥,𝑦,𝑧≤𝑁,如果 (𝑥,𝑦) 和 (𝑦,𝑧) 都是黑色,那么就把 (𝑧,𝑥) 涂黑。
请计算出当再也没有白色格子能被涂黑时,黑色格子的个数。
1≤𝑁,𝑀≤105;1≤𝑎𝑖,𝑏𝑖≤𝑁。1
题解
按照套路,我们应该把行和列看成点,即有 1∼𝑁 个点,每个格子 (𝑥,𝑦) 可以看成是 𝑥→𝑦 的一条有向边。如果存在边 (𝑥,𝑦) 与边 (𝑦,𝑧),就连边 (𝑧,𝑥),询问最终有几条边。
我们将每个弱连通分量分开考虑。
我们考虑什么时候不能加边了,大概是这 2 中情况:
- 已经是完全图了,边数为 𝑛×(𝑛−1)。
- 图被划分为 3 个集合(可以是空集)𝐴,𝐵,𝐶,𝐴 的所有点向 𝐵 的所有点连边,𝐵 的所有点向 𝐶 连边,𝐶 的所有点向 𝐴 连边,边数为 |𝐴|×|𝐵|+|𝐵|×|𝐶|+|𝐶|×|𝐴|。
我们发现一个点集如果会到情况 2,那就到情况 2,否则就是情况 1。
于是我们尝试划分集合,将弱连通块中每个点一遍 dfs 染色,如果染色成功,那就是情况 2,否则就是情况 1。