LGP4473口胡

为什么没有老哥写 \(O(nm)\) 个点和边的优化建图啊(

跳出去太难了,逆向思维,考虑怎么跳回来。

计算 \((s,t)\) 的最短路改为计算 \((t,s)\) 的最短路,这样子相当于进入节点时需要付出 \(w_v\) 的代价。

而有一个结论就是第一个松弛该节点的点一定是最短路。因为 \(w_v\) 显然不大于别的任何 \(w_v+w_u\),且松弛节点一定是已有节点中距离最短的。

于是考虑怎么跳回来。显而易见的是对于曼哈顿距离只需要旋转四遍分别考虑就行了。

原本条件下 \((x_1,y_1)\) 能到 \((x_2,y_2)\) 的条件是 \(x_1-x_2+y_1-y_2\leq B[x_1][y_1]\),其实直接考虑建反边就行了。上述条件等价于 \(x_1+y_1-B[x_1][y_1]\leq x_2+y_2\),使用前缀和优化建图即可。

显然上述过程点和边的数量都是 \(O(nm)\) 的,所以我们得到了一个直接 Dijkstra 就能通过的算法。

posted @ 2022-07-28 20:11  Prean  阅读(11)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};