P3469 [POI 2008] BLO-Blockade

是这样的,对于我们的一个节点 \(i\),希望计算答案,可以拆分成这几个部分。

\(i\) 的所有切开会变为单独连通块的儿子为 \(s_{k}\),子树大小为 \(siz_{p}\)

  1. 删除所有它的边之后,它就成为了一个单点连通块,这时候,与其它所有点都有贡献。这里只考虑从它出发,所以对答案贡献 \(n-1\)

  2. 删除所有它的边之后,它的儿子可能会变成联通块,这时候,儿子联通块与其它所有点都有贡献,对答案贡献 \(siz_{s_{k}}\times (n-siz_{s_{k}})\)

  3. 删除所有它的边之后,它的父连通块可能会变成连通块,这时候,父节点连通块的大小就是 \(\displaystyle n-\sum^{k} siz_{s_{k}}-1\),那么贡献就是 \((\displaystyle n-\sum^{k} siz_{s_{k}}-1) \times (\sum^{k} siz_{s_{k}}+1)\)

于是我们根据 tarjan 算法,切掉 \((i,j)\) 后,它们会分别变为两个连通块,当且仅当 \(low_{j}>dfn_{i}\)\(i\) 是父节点)。

计算即可。

时间复杂度 \(O(n+m)\)

代码就不给了。

posted @ 2025-02-24 17:25  PM_pro  阅读(26)  评论(0)    收藏  举报