一些关于图中关键边和伪关键边的想法

前言

实际上是有同学给我看了这么一个题才产生的这个东西:一个图中,如果一条边被删除后,最小生成树权值和会变大,那么这条边就是关键边;如果一条边可以出现在最小生成树中,但是删除不影响最小生成树权值和,那么就称作伪关键边。

然后他需要这个题一个复杂度最优的做法,于是我们就在群里陆续给出了下面的做法们。

一个简单的暴力

首先我们可以想到直接去判断每条边的类型:
首先我们可以先求出来最小生成树的权值和。然后做如下的处理:
1,如果我们强制不选某条边之后,最小生成树权值和变大了,那么它就是关键边。
2,如果我们强制选某条边之后,最小生成树权值不变,且它不是关键边,那么它就一定是伪关键边。
3,剩余的边就都是其他边了。

然后我们就可以很容易的得到我们这个暴力的复杂度就是:
首先一次最小生成树是 O ( m l o g m ) O(mlogm) O(mlogm) 的。然后我们会再做 m m m 次最小生成树,这部分是 O ( m ∗ m ) O(m*m) O(mm) 的,因为之前排序过了,不需要再次排序。于是总复杂度就是 O ( m 2 ) O(m^2) O(m2) 的。

一些简单的思考

我们首先可以想到,如果我们求出来了一个最小生成树,那么上面的边必然是关键边或者伪关键边,其余的边只可能是伪关键边或者其他边。那么我们就可以考虑利用这棵树来搞点东西。(后续我们称这棵树上面的边为树边,其余的为非树边)

我们回忆一下图的最小生成树计数,在这之中我们有一个重要的结论是最小生成树中每种边权的边的数量是不变的。于是我们对于这个问题就有一个做法是每次枚举一种边权,然后把树上其它边权的边都加进去然后做一次生成树计数。

这不是我们这个题的重点,我们关注的是这个思想。由这里我们可以看出来,一条边如果是可替换的,等价于在缩点之后的那个图中有环。进一步,我们可以得出它的两端在最小生成树上的路径中,一定存在和它相同边权的边。

通过这一系列的想法,我们就可以得到一个比较粗暴的做法:
1,我们还是先求出来最小生成树。
2,我们按照边权去枚举边。具体的,我们每次查询一条路径中是否有这种边权的边,这里可以通过单点赋值,路径求和来实现。然后我们如果查询到路径和大于0,那么这条边就是伪关键边,我们考虑给这个路径打上另外一种标记。之后我们查询树上这种边权的边是否被新标记覆盖,被覆盖就是伪关键边,否则就是关键边。
3,在做完每种边权之后,我们把所有操作原样回退回去。

我们简单分析一下复杂度:
首先还是求最小生成树的 O ( m l o g m ) O(mlogm) O(mlogm) 。然后我们注意到,我们后面的查询和修改的总次数是 O ( m ) O(m) O(m) 的,于是复杂度是 O ( m l o g 2 n ) O(mlog^2n) O(mlog2n) 的。总复杂度就是 O ( m l o g 2 n ) O(mlog^2n) O(mlog2n)

一堆套路的优化

其实我们前面的一些简单思考已经足够充分了,只是我们的维护手法太简单了。我们考虑一些更精细的维护。

首先我们先梳理一下我们实际上需要哪些信息:
1,我们需要知道每条非树边对应的路径
2,我们需要知道路径上有没有某种权值的边
3,我们需要判断一条边有没有被覆盖过

在开始处理这三个问题之前,我们考虑在求解最小生成树的同时,将边权离散化一下。这里的复杂度也是 O ( m l o g m ) O(mlogm) O(mlogm) 的。下面我们考虑一个一个来处理前面的信息。

对于一条树上路径,实际上我们只需要知道它的两个端点和LCA就能知道它的全貌了,于是我们可以使用离线tarjan求LCA来求这一步。这里的复杂度是 O ( m ) O(m) O(m) 的。

对于第二个信息,我们可以利用前缀和的思想,将一条路径上的某种边权的数量变成两个端点处的减去 2 2 2 倍LCA处的。于是我们直接开一个桶在遍历的时候维护一下这个信息即可。这里的复杂度也是 O ( m ) O(m) O(m) 的。

现在我们已经知道哪些非树边是伪关键边了,下面考虑怎么维护覆盖信息。我们考虑进行树上差分:对于边权为 v v v 的边,我们考虑在端点处打上 ( v , 1 ) (v,1) (v,1) 的标记,在LCA处打上 ( v , − 2 ) (v,-2) (v,2) 的标记。这样我们还是开桶去遍历,就能判断出每条树边是不是被覆盖过了。这部分的复杂度依然是 O ( m ) O(m) O(m) 的。

于是我们的总复杂度就是 O ( m l o g m ) O(mlogm) O(mlogm) 的,瓶颈在最小生成树和离散化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值