P3469 [POI 2008] BLO-Blockade
是这样的,对于我们的一个节点 \(i\),希望计算答案,可以拆分成这几个部分。
设 \(i\) 的所有切开会变为单独连通块的儿子为 \(s_{k}\),子树大小为 \(siz_{p}\)。
-
删除所有它的边之后,它就成为了一个单点连通块,这时候,与其它所有点都有贡献。这里只考虑从它出发,所以对答案贡献 \(n-1\)。
-
删除所有它的边之后,它的儿子可能会变成联通块,这时候,儿子联通块与其它所有点都有贡献,对答案贡献 \(siz_{s_{k}}\times (n-siz_{s_{k}})\)。
-
删除所有它的边之后,它的父连通块可能会变成连通块,这时候,父节点连通块的大小就是 \(\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)\)。
代码就不给了。

浙公网安备 33010602011771号