给定 \(n\) 个点 \(m\) 条边的无向图,以及 \(s, t, L\)。每条边有边权(有些被抹去),你要为每个被抹去的边权赋一个正整数值使得 \(s \rightarrow t\) 的最短路为 \(L\)。
\(n, m \le 10^5,L \le 10^9\)
首先把所有未知边权赋为 \(1\),跑一边 dij,判掉无解。
做法一:二分
有一个性质:一条边的边权 \(+1\),最短路 \(+ 0/1\),所以可以二分总共加多少,对于那些不知道的边权按顺序加即可,然后跑 dij 判断最短路是否 \(\le L\)。
时间复杂度:\(O(m \log m \log (mL))\)。
这个做法运用了一个性质,然后无脑跑就行了。
做法二:调整法
在全 \(1\) 的基础上,设 \(dt_u\) 表示 \(t\) 到 \(u\) 的最短路。
在跑 dij 的过程中,如果枚举的这条边 \((u, v)\), \(ds_u + dt_v + w < L\),手动将 \(w\) 调成 \(L - ds_u - dt_v\),保证这条路不可能得到 \(< L\) 的最短路,同时还存在 \(=L\) 的最短路。所以最后最短路就是 \(L\) 了。
这样子其他 \(dt_u\) 被影响了也没关系,因为被影响的 \(dt_u\) 不可能还构成最短路 \(< L\) 的情况了。。
时间复杂度:\(O(m \log m)\)。
正确性有点难理解。