缩点,记录每个 bcc 内部的边的数量和点的数量,然后在缩点后的树上 dfs 以计算所有不合法情况数量(至少两座军营无法相互到达的情况数量)。
缩点后的树边是桥,每个桥把树分成两个部分。钦定不保护一座桥,计算袭击这座桥导致出现军营之间无法相互抵达的情况数量。
称桥两端的两个子树为上方树和下方树,两树中的所有边可以任选,每个树中至少选择一个点作军营,缩点前有 n 个点 m 条边的树的贡献为 (2n−1)×2m,两树贡献的乘积就是当前钦定不保护的桥对不合法方案的贡献。
为防止重复统计答案,在计算完成之后将下方树从图中删除,因为在所有袭击当前桥而导致不合法的方案中下方树必定有点被选择,删除后这些点再也不会被选择,贡献不会被重复统计。
总方案数量为 (2n−1)×2m,容斥得到所有合法方案数量。
实现中下方树是 dfs 过程中的叶子节点,通过记录上方树剩余的边数和点树来统计答案,删除下方树即在剩余点数中扣除当前节点的点数,扣除当前节点的边数 +1(当前选定的桥)。
答案不正确,不清楚原因,求差错或者证伪做法。
Code