Network(思维-随机数)

对于给定的无向连通图,通过DFS找到桥和返祖边,计算移除两条边使得图不连通的方案数。桥的贡献为C*(m-1) - C*(C-1)/2,返祖边相同的节点集合可额外贡献k*(k-1)/2。利用随机数处理返祖边状态。
摘要由CSDN通过智能技术生成

题意描述:

给出N个点,M条边的无向连通图,求移除两条边后使得该图不连通的方案数。

N <= 2000 , M <= 100000

解题思路:

取一个点为根进行dfs,得到一颗dfs树,标记树边,那么非树边只存在返祖边(u和v为祖先-子节点关系)

用 sum[u] 表示u节点子树中越过u的返祖边的数量(到达u不算越过u)。

用 sta[u] 表示u节点子树中越过u的返祖边的集合。

1. 很明显桥的sum[u] = 0, 记桥的数量为C,则桥的答案贡献为 C*(m-1) - C*(C-1)/2 。(选择桥,图已经不连通,另外一条边有m-1种方案,再去重选择两条桥的方案就是贡献)

2. 若有节点的sum[u] = 1,则子树只有一条返祖边越过了u,那么选择u的父亲边和这条返祖边可以贡献+1答案。

3. 若有若干个节点的返祖边状态完全相同,sta[u1] = sta[u2] = ... = sta[uk] ,则贡献k*(k-1)/2个答案,如下图所示,图中u1和u2的 sta[u] 都是{a,b},集合大小为2,答案贡献为2*(2-1)/2 = 1。(在sta[u]相等的集合中任选两个节点,删去他们的父亲边都能使得中间部分与图不连通,sta[u]可通过给每条返祖边赋一个随机值来保存状态)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值