关键网线题解

前言

虽然这道题并不难,但我还是挺激动的,因为我用上了牛客比赛上学的 一直吃灰 的换根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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值