题解【CF724E Goods transportation】


传送门。

$\texttt{Solution}$

有 $n$ 个城市,若 $i

第 $i$ 个城市初始有 $p_i$ 个货物,最多卖 $s_i$ 个货物。

求最多卖掉的货物的数量。

$1\le n\le 10^4$。

$\texttt{Description}$

好神的题啊/se,但可能我理解太弱了,感觉楼下的 DP 讲的太模糊了

考虑一个非常显然的网络流:

  • $s$ 向每一个城市 $i$,连一条容量为 $p_i$ 的边。
  • 每一个城市 $i$ 向 $t$,连一条容量为 $s_i$ 的边。
  • 对于 $i

这样建图的边数是 $n^2$ 级别的,跑网络流直接炸飞。

这时候就用到一个小 $\texttt{trick}$:最大流 $=$ 最小割。我们可以通过求最小割来求出最大流。

考虑 DP,设 $f_{i,j}$ 表示,到了第 $i$ 个点,有 $j$ 个和 $s$ 的边未被割掉。

为什么这个东西可以 DP 呢?因为题目中有一个重要条件:$i

回到正题,考虑转移。

一个点 $i$ 有两种选择,断掉它于 $s$ 的边,或断掉与 $t$ 的边。

若断掉与 $s$ 的边,不光需要断掉与 $s$ 之间,容量为 $p_i$ 的边,还需要断掉,和 $s$ 之间没有断掉边的,那 $j$ 个点之间的边,每一条边的容量都是 $c$,一共需要断 $j$ 条,所以需要断掉的容量是 $c\times j$。

这只是 $i$ 一个点的花费,它还需要加上前 $i-1$ 个点的花费。

此时 $i$ 是不算在 $j$ 个节点内的,所以前 $i-1$ 个节点中,一共有 $j$ 个是与 $s$ 直接相连。

所以此时,$f_{i,j}=f_{i-1,j}+p_i+c\times j$。

同理,如果断掉与 $t$ 的边,则只需要断掉 $s_i$ 那条边,但是此时,$i$ 已经算在 $j$ 个点内了,所以前 $i-1$ 个只有 $j-1$ 个与 $s$ 直接相连。

所以此时,$f_{i,j}=f_{i-1,j-1}+s_i$。

两者取 $\min$,得到转移方程:

$$f_{i,j}=\min(f_{i-1,j}+p_i+c\times j,f_{i-1,j-1}+s_i)$$

最终答案为 $\min_{0\le i\le n}\{f_{n,i}\}$。

但是空间会爆炸,所以直接将第一维滚动数组滚掉就好了。

最终时间复杂度 $\Theta(n^2)$,空间复杂度 $\Theta(n)$,可以通过本题。

代码就不放了,核心也就 $\texttt{5,6}$ 行的样子,需要者私信。

$\texttt{AC}$ 链接。

$$\texttt{The End.by UF}$$