网络流

网络流 24 - 1 题

负载平衡问题

贪心

环形均分纸牌,首先有很典的贪心,吊打网络流

\(d_i\) 表示 \(i\)\(i \bmod n + 1\) 传递的数量,\(aver = \dfrac{\sum_{i = 1} ^ {n} a_i}{n}\),那么有:

\[\begin{cases} aver = a_1 - d_1 + d_n \\ aver = a_2 - d_2 + d_1 \\ \dots \\ aver = a_n - d_n + d_{n - 1} \end{cases} \]

代入消元,可得通项公式 \(d_i = \sum_{j = 1} ^ {i} a_j - j \times aver + d_n = d_n - \sum_{j = 1} ^ {i} (aver - a_j)\)

这个明显可以前缀和,设 \(s_i = \sum_{j = 1} ^ {i} (aver - a_j)\),那么最终答案 \(\sum_{i = 1} ^ {n}\left\vert d_i \right\vert =\sum_{i = 1} ^ {n} \left\vert d_n - s_i \right\vert\),显然 \(d_n\) 取中位数最优。

费用流

首先建立源点和汇点 \(s, t\)\(s\) 向每个仓库连容量为 \(a_i\),费用为 \(0\) 的边,每个仓库向 \(t\) 连容量为 \(\bar{a}\) ,费用为 \(0\) 的边。然后相邻仓库之间连容量为 \(+\infty\),费用为 \(1\) 的边。跑费用流即可。这个非常直观。

分配问题

二分图带权匹配,分别跑最小费用最大流和最大费用最大流即可。

运输问题

同上。

方格取数问题

遇到相邻的不能同时选,可以将图黑白染色,转成二分图处理。

转成二分图后,问题转化成二分图最大点权独立集问题,这个问题可以继续转化。

最大点权独立集可以看做总权值减去最小点权覆盖集的结果。因为最小点权覆盖集是每对点至少选一个的最小权值,反过来取补集,就是每对点至多选一个的最大权值。

最小点权覆盖集可以转化为最小割,具体而言,染色后,\(s\) 向黑色点连边,白色点向 \(t\) 连边,容量为点权。剩余按原图连边,容量为 \(+ \infty\) 。显然我们不会割断容量为 \(+ \infty\) 的边,那么被割断的边就表示我们选中了与它相连的黑色或白色点,跑最大流即可。

汽车加油行驶问题

分层图最短路,用费用流写没啥意义。

航空路线问题

每个点只能走一次,我们可以考虑拆点。

每个点拆成入点和出点,中间连容量为 \(1\) 的边,这样就满足了只能走一次的限制。\(1\)\(n\) 是特殊点,可以走两次,所以它们的入点和出点连边容量为 \(2\),这种边对答案无贡献,费用为 \(0\)

其他原图中的边,\(u_{out}\)\(v_{in}\) 连边(注意其中 \(u < v\),我们把路径看做两条 \(1\)\(n\) 的拼起来,所以全部从左向右连边),容量为 $+ \infty $,费用为 \(1\)。容量限制是考虑到每个点内部已经限制了只能走一次,所以外部的连边可以不考虑限制,同时还有更强的鲁棒性,对于 \(n = 2\) 的特殊情况,这样的连边方式也可以处理而不需要特判。 最后跑源点为 \(1_{in}\) ,终点为 \(n_{out}\) 的最大费用最大流即可。最大流为 \(2\) 说明有解。

方案输出可以通过两次 dfs 实现。

posted @ 2023-12-13 16:44  harqwq  阅读(15)  评论(0)    收藏  举报