网络流
\(\text{P2766}\)
拆点容易
\(\text{P4001}\)
转对偶图,跑最短路,可以找题解,关于对偶图为什么可以找到答案
我解释怎么建图:
n行m列,那么就有左下的 \(S\) 点 和 右上 \(T\) 点,以及 \((n-1) \times (m-1)\) 个正方形块,对于 \((i,j)\) 正方块,他被划分为 \(2j,2j-1\) 两个三角形,对应左下三角形,和右上三角形
那么这样对每一个区块编号后,就好建图了
对于横边,他就是上一行的左下三角形,和这一行的右下三角形连边,表示切断这条边,如果这条横边在第一行或者最后一行,就把这个三角形, 和 \(S , T\) 连边
竖边,斜边同理
\(\text{P4714}\)
关于网络流上的最小割:
- 割指把图的点集分成两个集合,S和T分属两个集合(\(S\in A, T \in B\)),这个图上由 \(A\longrightarrow B\) 的边就是这个图的割边
- 这些边的和的最小值,就是最小割
- 形象的说就是把图分成两半,使不存在 \(S\) 到 \(T\) 的路径
建图方法
- \(S\) 向用户, 边权:该用户的收益
- 该用户向他使用的两个中转站, 边权: \(inf\)
- 该中转站向\(T\),边权:成本
答案:所有用户总收益\(-\)最小割
原因:
- 首先对于这样的用户 \(i\),最小割肯定不会去割\(inf\)的边,不然就不是最小的割
- 最小割肯定会割\((S,用户)\) 的边,不然就得把 \((中转站A,T)和中转站(B, T)\)割掉,因为只有这样,才会使得没有\(S\) 到 \(T\) 的路径
- 这个最小割表示他在总收益的基础上放弃了哪些收益
- 割掉了\((S,用户)\)表示决定不满足这个用户的要求,放弃了这个用户的收益
- 割掉\((用户,中转站A,B)\) 表示决定满足这个用户的要求,那么就要付出建立这两个中转站的代价
- 因为是最小割,他会让放弃的利益尽可能小,也就是总收益最大
\(\text{P3227}\)
先说建图方法
- \(S\longrightarrow (i,j,1), \;\)
flow$ = inf$- \((i,j,k)\longrightarrow (i,j,k+1), \;\)
flow$ = v[i][j][k]$- \((i,j,r)\longrightarrow T, \;\)
flow$ = v[i][j][r]$
以上的建图方法,就是在不包含 \(D\) 的限制下的建图
什么意思呢?对于每一个\((i,j)\)我们建了一条\(S\) 到 \(T\) 的路径,那么这条路径上就必然要割掉一条边,那么割哪条边,就表示 \((i,j)\) 这个位置的值是多少,边权就是代价
但是本题我们还有 \(D\) 的限制
解决方法
- \((i,j,k)\longrightarrow(i\pm1,j,k-d), \;\)
flow$ = inf$- \((i,j,k)\longrightarrow(i,j\pm1,k-d), \;\)
flow$ = inf$
也就是往对于 \((i,j)\) 有限制的相邻格子连边,这样连边的话,如果填的值差超过了 \(D\) 那么就可以通过我们连的这条边还存在路径,而我们连的边又不能割所以填的值就不会超过 \(D\)
\(\text{P1361}\)
先说建图方法
- \(S\longrightarrow 物品i, \;\)
flow$ = 收益A_i$- \(物品i \longrightarrow T, \;\)
flow$ = 收益B_i$- $ S \longrightarrow x, ;$
flow$ = 收益c1_i$- $ y \longrightarrow T, ;$
flow$ = 收益c2_i$
- $ x \longrightarrow 组合i的每个物品, ;$
flow$ = inf$- $ 组合i的每个物品 \longrightarrow y, ;$
flow$ = inf$
很好理解,这里求最小割表示放弃哪些收益,所以答案是所有收益减最小割
然后前两条边必然割一条,割的S,就表示物品放到B中,放弃了 \(A_i\)的代价
反过来差不多
然后其他的边可以发现如果没有让一个物品放在A中,那他的所有组合x的收益\(C1_i\) 就会割掉,不然等于白割了这个物品放弃A的收益,必然不优
反过来也是一样

浙公网安备 33010602011771号