最近两个月在做《线性规划与网络流24题》这套题,加深了对网络流的理解。
涵盖到的模型有:二分图匹配、二分图的最大独立集、最大权闭合图、有向无环图的最小路径覆盖、最多不相交路径、最大权不相交路径、区间k覆盖、最短路。第13题涉及到与二分法的结合(其实也可以逐层枚举)。
设二分图G=(V, E)的两个顶点集为X, Y。
定义不包含容量为inf的边的割为简单割。本网络中,最小割是简单割。
什么叫覆盖集?对于每条边,其两端点至少有一个被选中。割的性质是不连通:任何一条s-t路径上,至少有一条边属于割集。这里所有的s-t路径由3段构成,中间的Xi->Yj容量为inf,不属于简单割。因此,二分图的覆盖集和简单割一一对应。最小割是容量最小的简单割,也是点权之和最小的覆盖集。
对于不带权的二分图图,令所有点点权=1。以这种方式我们求出的是其最小覆盖集,也是其最大匹配。因而,我们证明了König定理:二分图的最大匹配等于最小覆盖。
最小覆盖集和最大独立集是互补问题。
覆盖集:对于每条边,至少选一个端点,即至多不选一个端点。
独立集:对于每条边,至多选一个端点,即至少不选一个端点。
求最大独立集,等价于求其补集,也就是说每条边刨出至少一个端点,并且刨出的点的权和最小,这样才使剩下的最多。|最大独立集|+|最小覆盖集|=所有点的权值之和。
设正权点的集合为V+,负权点的集合为V-。
可行性方面,简单割和闭合图一一对应。设简单割为[S, T],S-{s}即为闭合图中的点。
简单割对应闭合图:反证。假设存在u∈S-{s},v∈T-{t},且(u, v)∈E。因为(u, v)∈E,所以网络N=(V’, E’)中存在(u, v)∈E’且c(u, v)=inf。又因为u, v分属s, t,所以这条边属于[S, T],与简单割的假设矛盾。
闭合图对应简单割:反证。假设[S, T]不是简单割,那么存在u∈S-{s},v∈T-{t},且c(u, v)=inf。这只会当存在(u, v)∈E时发生,与闭合图的假设矛盾。
数量关系方面,最小割意味着最小化“刨开的正权+保留的负权的绝对值”。用正点权之和去减,得到“保留的正权-保留的负权的绝对值=保留的正权+保留的负权”。
DAG的最小路径覆盖=|V|-对应二分图的最大匹配。
约束是什么?对路径的定义中,有至关重要的一点:允许长度为0。于是解的存在性得到了保证。因此,只需满足:对于任意一点,至多有一条与它关联的入边和与它关联的出边被选中。
二分图的匹配,可以从顶点对应的角度看待,也可以从边的角度看待:选出一些边,使得每个顶点至多与一条边关联。和本问题的约束对比,发现有向无环图不是二分图,并且对于顶点而言,边分为入边和出边两类。考虑把点i拆成Xi、Yi,入边连到Yi,出边从Xi出发。这样,问题的约束便和二分图匹配相一致。
目标是什么?使路径覆盖数最小。除了直接数,还能用什么来刻画路径覆盖数?头的数量或尾的数量。什么样的点是头?没有匹配边与对应的Yi关联。尾?没有匹配边与对应的Xi关联。所以,DAG的最小路径覆盖=|V|-对应二分图的最大匹配。
hzwer这儿有另一种更简洁的看待方法:
如果无匹配,显然要n条路径才能覆盖所有点,两个点匹配意味着将可以把它们用一条路径覆盖,路径数就可以减1
我还有一种另类看待方法:
带上下界的网络流。
Step 1
- s->Xi,容量上界为1。
- Xi->Yi,容量下界为1,上界inf。
- Yi->Xj,(i, j)∈E,容量上界为1。
- Yi->t,容量上界为1。
求解s-t最小流。
Step 2
看出一个可行流,于是省去通常求解s-t可行流的步骤。
网络变换为:
- Xi->s,容量上界为1。
- Yi->Xj,(i, j)∈E,容量上界为1。
- t->Yi,容量上界为1。
此网络的t-s最大流与原s-t可行流的叠加,即为原s-t最小流。s-t可行流的值为|V|,用|V|去减t-s最大流即可。
这种看待方法和hzwer的在实质上相同,但是是从形式上的变换得到的。
为什么强调DAG?因为我们只是简单地拆点、匹配,而没有在意这两点是否已经在同一条路径里了。比如,一个环,对应二分图的最大匹配为|V|,实际上,作为一条有始有终的“路径”,它是不能封口的。
在原图上改造,用容量1描述“不相交”的约束,用源、汇发出、接受的容量限制最大权不相交路径问题中路径的条数。若要求顶点也不相交,可采用拆点的手段给结点赋容量。
把状态看作顶点,状态的转移看作边,边权是转移的代价。如果一个问题有最优子结构、重叠子问题两个性质,令你很想使用动态规划方法,却苦于无法确定计算顺序,那么不妨尝试最短路模型。有时,用不着把图存起来,把转移写在最短路过程里即可。这样免去了分层图的一些麻烦,也提高了程序的时间效率。
状态是什么?哪些量能简洁而完整地刻画它?状态之间的转移关系是怎样的?
做过两道与之有关的题目:[HNOI2007]紧急疏散evacuate、[CTSC1999]家园。从刘汝佳老师的书上学习了“公平分配问题”。
前两题的一个共性是相对论的四维时空观:按时间拆点,体现了分层建图的思想。
可以通过比较流量和待分配的数目,判定此次尝试的成功与否。可以通过修改一些边的容量、修改图的层数,为新的一轮尝试做准备。
有时,无解的判定、二分上下界的确定成为问题。比如家园一题。我判定无解的方式是,先在三维空间内建图,判定地球、月球是否连通。如果连通,总存在一种方案拯救人类,因为可以等待。但是我估算的二分范围太松了,导致最后一组TLE。在题解的启发下,将上界和某常数取min……不少题解是枚举的,循环到某个常数便停止(说只是TLE和WA的区别……),于是便省去了估算范围这一步骤。由于增广路算法本身就是在一遍遍迭代,这样逐层枚举,由于先前的残存网络尚在,也取得了不错的时间效率。
在CodeVS 1034的题解页面还发现了一个费用流解法(Solution_ID:4685 by 6755),使人们走较近的路去月球,最后判断最后走过的从月球到汇点的边。但这样一开始就得建很多层图,需要对答案范围的敏锐感知。
提交记录里时间差异挺大的……有2ms,有几十ms,有像我这样上百ms。