闲扯
一年前刚学倍增的时候老师给的训练题,一直没做,过来填坑了。
题面
Solution
因为每秒能跑的长度为 $2^k$ ,所以对于一对 $u,v$ ,如果它们之间的距离能用 $2^k$ 表示出来,那么我们就可以从 $u$ 向 $v$ 连一条长度为 $1$ 的边。
而这个问题的形式恰好是倍增能够解决的,所以我们直接用 $mp_{i,j,k}$ 表示从 $i$ 向 $j$ 的路径长度能否用 $2^k$ 表示,然后结合一下 $Floyd$ 的写法,得到所有的 $mp_{i,j,k}$ ,如果 $mp_{i,j,k}=1$ ,那么我们就从 $i$ 向 $j$ 连一条权值为 $1$ 的边,然后 $Floyd$ 跑最短路即可。
Code
1 |
|
总结
这道题有 $2^k$ 这种很好的形式,考虑到倍增就是以其为基础的,巧妙的运用倍增来解题。