图论随手记 - 最短路

· · 个人记录

顺序有点乱,后续会排一下,然后分板块整理

All

Dijkstra

Bellman Ford

Floyd

建图思路

  1. 拆点

    Eg. Paired Payment

    如果这里没有权值为 (w_{a,b} +w_{b,c})^2 的限制的话, 那么就可以把一个点拆成两个点(也就是两层图),然后对于每一条边也拆成两条边:e(u_1, v_2), e(u_2, v_1) 那么这样就保证了走到 1 层一定会经过两条边,所以最后答案取该层即可。对于一定要走 k 条边也可以这样处理。

    但是这里有这个平方的限制。

    再看一眼数据范围 w \le 50,所以可以根据这个建边了。

    0 层为原图(不连边), 1 \to k 层表示走到这个点经过的上一条边的边权为 k,然后对于 u 以及它连接的点 v 建立 e({(u, 0), (v, w)}, 0) 然后再对于 u,枚举所有边权,建立 e((u, i), (v, 0), (i * w_{u, v}) ^ 2),跑最短路即可。最后答案即为走到 s,0 时的权值。

    Eg. 传送卷轴

    这里需要处理一下传送。显然,直接连边不太现实,边数过于大了。

    考虑传送的限制 abs(dis_x - dis_y) = k

    发现这里暴力连接的所有边是有重复部分的,所有同一深度的点都会指向 dis_i + kdis_i - k 的所有点,考虑将重复部分不再反复建边,这时候建立 n 个中转点 dis_i + n,每次先走到 dis_{i \pm k} 这个点,然后通过这个点走到这一深度的所有点,所以只需要连接 u, dis_{u \pm k} +ndis_i 到这一深度的所有点即可。

    形如: