前言
虽然这道题并不难,但我还是挺激动的,因为我用上了牛客比赛上学的 一直吃灰 的换根dpdpdp,一激之下,猛敲出了这篇题解 (虽然正解比这简单多了…)
题解
我们可以这样翻译题面。
给出一个无向图,有的点标记为 'A', 有的点标记为 'B',要求断开任何一条割边后,分
出的两个联通块中,有一个块不包含 'A' 或 不包含 'B',求这样的割边的个数
我们先缩点,将每一个双联通分量收缩成一个点,由于图联通,我们可以得到一棵树,就像这样。

所以我们只需要枚举缩点后的每一条边(TaTaTa一定是割边),再统计两棵子树所含 ′A′'A'′A′和 ′B′'B'′B′ 的数量即可,暴力跑的话最坏时间复杂度 O(n2)O (n ^ 2)O(n2) ,一定超时,这时我们就要用上换根dpdpdp了。

我们只考虑计数 ′A′'A'′A′, 因为′B′'B'′B′同理
首先任选一个根节点。
记 dpdonw[i]dpdonw[i]dpdonw[i]表示以iii为根节点的子树的 ′A′'A'′A′ 的数量
记 dpup[i]dpup[i]dpup[i]表示iii节点的所有非子孙节点的 ′A′'A'′A′ 的数量。
状态转移方程:
第一种推导方法:根据图我们发现 dpup[u]=dpdown[fa]+dpup[fa]−dpdown[u]dpup[u] = dpdown[fa] + dpup[fa] - dpdown[u]dpup[u]=dpdown[fa]+dpup[fa]−dpdo

最低0.47元/天 解锁文章
9977

被折叠的 条评论
为什么被折叠?



