网络流 24 题做题笔记

先立个 flag,寒假结束前切完。

◈ 完成网络流 24 题(6/24)

1 最大流

1.1 P2756 飞行员配对方案问题

链接

思路:

其实可以用二分图过,匈牙利之后就没了,网络流的话貌似是建图后在 DFS 中判断某一条是否被流量流过。

1.2 P2754 [CTSC1999] 家园 / 星际转移问题

链接

思路:

首先判断是否有解,可以使用并查集。

分层图,我们将每一个时间节点视为一层图,通过枚举时间节点,一边跑 Dinic 一边建图。具体的,加入在 \(t\) 时刻某一飞船在 \(x_k\),在 \(t+1\) 位于 \(x_{k+1}\),那么我们将在第 \(t\) 层图中的点 \(x_k\) 向在第 \(t+1\) 层图的 \(x_{k+1}\) 连边。另外,我们需要建立多个起点(即地球),再建立一个超级源点连向它们,至于汇点可以固定(即不需要建立多个月球)。还有一个细节,因为是一边建图一边跑,需要在残量网络中跑网络流。

1.3 P2766 最长不下降子序列问题

链接

思路:

对于第一问,DP 解决(设以 \(a_i\) 结尾的最长不下降子序列。

对于第二问,我们可以对于所有的 \(f_i=1\)\(i\) 与源点建边,流量为 \(1\);对于所有的 \(f_i=s\)\(i\) 与汇点建边,流量为 \(1\);对于每一对 \((i,j)\) 满足 \(j \ge i\)\(a_j \ge a_i\),由 \(i\)\(j\) 连边,流量为 \(1\)。这样,最大流即答案,但是是错的,因为可能会出现一个点流过了 \(\ge 2\) 的流量,也就是该点出现在了至少两个最长不降子序列当中,不合法。我们可以将 \(i\) 分裂为 \(i_1\)\(i_2\),其中 \(i_1\) 保留 \(i\) 的所有入度,\(i_2\) 保留 \(i\) 的所有出度,再建边 \(i_1 \to i_2\),流量为 \(1\),达到了限制点的流量经过的效果。此时答案就是最大流。

对于第三问,将点 \(1\)\(n\) 的点流经限制改为 \(+\infty\),且源点向点 \(1\) 的边流量无限制(改为 \(+\infty\)),若 \(f_n=s\) 则也取消掉 \(n\) 至汇点的限制。再跑一边 Dinic 完事。

2 最小割

2.1 P2774 方格取数问题

链接

思路:

最小独立集经典问题。首先考虑将方格中相邻点全部建边,构成一个二分图,且二分图中边流量上限设置为 \(\infty\)。再将源点与所有左部点连边,汇点与所有右部点连边,流量上限为其在网格中对应权值。接下来跑最小割,没有被删掉的边与之对应点即被选中的点。

原理大致就是,因为若两点有连边(即在方格中相邻),两者至少有一个不选。我们建图方式会使两者出现让该图出现通路,在最小割中会选择删除两点与源点或汇点的连边中的至少一条,所以跑完最小割剩下的点就是可以选的点。

2.2 P2762 太空飞行计划问题

链接

思路:

不难发现,对于一场实验,要么做实验,要么将这一场要用的仪器全部不买(其它要做的实验用到的除外)。很容易想到建图方式,对于一场实验将其与之所有要用的仪器连边,构成一个二分图,其间容量为 \(\infty\)。再将左部点与源点连边,右部点与汇点连边,容量为该实验的收益或该仪器的价格。

跑最小割,答案就是所有实验的收益之和减去割去的边(若某实验被割,则说明该实验不用做,需减去;若某仪器被割,说明至少有一场实验要用到它,需要在收益中减去它的花费)。至于方案,就是所有与源点相连的边(若某实验被割,则该实验不需要做,且其所有相关的仪器若没有其它要做的实验用到,也不联通,即也不需要)

2.3 P3355 骑士共存问题

链接

思路:

方格取数 Pro MAX。

posted @ 2024-01-09 20:08  Pretharp  阅读(30)  评论(0)    收藏  举报