Logo WF_wxl 的博客

博客

#777-题解

avatar WF_wxl 2026-10-11 19:57:18

CF2057E2。

声明:本题解的撰写受到了deepseek与qwen的在思路上的帮助,但所有文字与公式全部由本人独立撰写,可以放心食用。

这题要求对于每个询问 $(a,b,k)$,在 $a$ 到 $b$ 的所有路径中,找到路径上边权第 $k$ 大值的最小值。直接枚举路径显然不行。

我们考虑二分答案 $x$。

一条路径的第 $k$ 大边权 $\le x$,当且仅当路径上边权 $>x$ 的边数不超过 $k-1$。

所以问题等价于:找最小的 $x$,使得存在一条 $a$ 到 $b$ 的路径,其中边权 $ >x $ 的边数 $ < k $。

这就相当于,把边权 $\le x$ 的边看成免费的,边权 $>x$ 的边看成收费的,问从 $a$ 到 $b$ 最少要走几条收费边。

预处理。

初始时,没有任何树边免费,所有边的费用都是 1。

我们先用 Floyd 求出任意两点间的最少边数,记为 $d[0][i][j]$。

跑Kruskal。假设新加入的树边是 $(u,v)$,它的费用从 1 变成 0。因为新边费用为 0,其他费用非负,所以最优路径最多用一次这条新边。于是转移就是:

$$d[c][i][j]=\min(d[c-1][i][j],d[c-1][i][u]+d[c-1][v][j],d[c-1][i][v]+d[c-1][u][j])$$

同时我们记录 $val[c]$ 为第 $c$ 条加入的 Kruskal 树边的权值。因为边已经按权值排序,所以 $val$ 数组是单调不减的。

处理完所有树边后,对于每个询问 $(a,b,k)$,我们只需要找到最小的 $c$,使得 $ d[c][a][b] < k $,二分即可。答案就是 $ val[c] $。

时间复杂度 $O(N^3+Q\log N)$。

评论

暂无评论

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。

WF_wxl Avatar
菜
活跃度 近 53 周
查看全年