题意简述
给定 $n$ 个点 $m$ 条边的有向图,边带权。$q$ 个操作,可能是求目前 $1$ 到 $u$ 的最短路或是将 $c$ 条边的权加 $1$。
$n, m\le 10^5, q\le 2000, \sum c\le 10^6$。
主要思路
$q$ 这么小,看起来像是 $O(nq)$。
先跑一遍 Dijkstra 来取得 $\langle dis_i\rangle$,表示 $1$ 到 $i$ 的最短路长度。
每次修改边权, $1$ 到任意其他点的距离比原先都不降。
那么求增量 $\langle f_i\rangle$。设 $e(u, v)$ 表示 $u, v$ 之间连边,$w(u, v)$ 表示 $u, v$ 之间边的边权。
显然对于点 $v$ 有 $f_v = \min\limits_{e(u, v)}(dis_u + f_u + w(u, v) - dis_v)$。
增量有上限 $c$,所以可以直接用桶 $O(n + m)$ bfs 做。
总时间复杂度 $O(n\log n + m + (n + m)q)$。
参考代码
1 |
|