UNPKG

oi-wiki

Version:
24 lines (12 loc) 1.81 kB
拆点是一种 **[网络流](/graph/flow/)** 建模思想,用来处理 **点权或者点的流量限制** 的问题这种思路同样可以用于其他的图论算法中(比较经典的有 **分层图** ) # 例题 经典问题 结点有流量限制的最大流 如果把结点转化成边,那么这个问题就可以套板子解决了 我们考虑把有流量限制的结点转化成这样一种形式:由两个结点 $u,v$ 和一条边 $<u,v>$ 组成的部分其中,结点 $u$ 承接所有从原图上其他点的出发到原图上该点的边,结点 $v$ 引出所有从原图上该点出发到达原图上其他点的边边 $<u,v>$ 的流量限制为原图该点的流量限制,再套板子就可以解决本题这就是拆点的基本思想 如果原图是这样: ![](./images/node1.png) 拆点之后的图是这个样子: ![](./images/node2.png) # 例题 [luogu P4568 \[JLOI2011\] 飞行路线](https://www.luogu.org/problemnew/show/P4568) 题目大意:有 $n$ 个结点, $m$ 条边, $k$ 张旅行券,可以使用一张旅行券使得经过该边的边权除以二向下取整,求从结点 $s$ 到 $t$ 的最短路的长度 当然可以使用 DP 方法解决这道题我们考虑使用拆点的解法 将每个结点拆成 $k$ 个点,这样图就可以形象化地看做是 $k$ 层,每层的结点之间连上原来就有的边,边权和原来相等;若图上存在边 $<u,v>$,则在当前层的 $u$ 所对应的结点和更高一层的 $v$ 所对应的结点,连接一条边权为原边权除以二向下取整的边这样可以保证最多只使用 $k$ 次旅行券,因为每次从较低的一层到上面一层,就相当于是使用了一张旅行券以最底层的 $s$ 所对应的点跑单元最短路即可