网络流

\(\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的收益,必然不优
反过来也是一样

posted @ 2026-07-30 08:18  wmq2012  阅读(5)  评论(0)    收藏  举报