CF827D Best Edge Weight
给出一张 \(n\) 个点 \(m\) 条边的无向带权图,对于每一条边,求出它的边权最大修改为多少时,它仍然在图的所有最小生成树上。
每条边的询问相互独立,即修改一条边时,其它边的权值不是修改后的权值而是这条边输入的权值。
\(n,m\le 2\times 10^5\)。
约定:记 \((u,v,w)\) 为 \(u,v\) 两点之间边权为 \(w\) 的连边。
考虑先求出原图的一棵最小生成树,并对其重链剖分。分两种情况考虑。
-
对于最小生成树上的边,若增大它的权值,它会被某些非树边代替,所以它的最大权值必须小于能代替它的最小的非树边的权值。因此维护一个 \(mn\) 数组,\(mn_i\) 表示能覆盖第 \(i\) 条边的最小非树边边权。考虑对于每一条非树边 \((u,v,w)\),所有最小生成树上 \(u,v\) 路径上的边的 \(mn\) 值,都要对 \(w\) 取 \(\min\),使用线段树维护。第 \(i\) 条边的答案即为 \(mn_i-1\)。若找不到边替换它则无解。
-
对于不是最小生成树上的边 \((u,v,w)\),若将其加入,则形成了一个包含 \(u,v\) 两点最小生成树上路径的环,那么需要在 \(u,v\) 两点最小生成树上的路径删去一条边,那么肯定是删去最大的那条边(设其权值为 \(mx\)),则这条非树边的答案为 \(mx-1\)。
对每条重链单独建线段树,对于一次路径操作,只有 \(\mathcal{O}(1)\) 条链是不完整的,需要拆成 \(\mathcal{O}(\log n)\) 个区间;剩下 \(\mathcal{O}(\log n)\) 条链都是完整的,操作的时候只会访问到根节点,时间复杂度为 \(\mathcal{O}(1)\)。
综上,时间复杂度为 \(\mathcal{O}(m\log n)\),空间复杂度为 \(\mathcal{O}(n+m)\),常数略大。

浙公网安备 33010602011771号