标签:
网络流问题本质上是线性规划问题的应用之一,线性规划问题的标准形式是给出一组等式约束和不等式约束,要求最优化一个线性函数。
在流问题中,变量以流量的形式出现在问题中,我们给出一个流网络(以有向图的形式)来解决有关流的问题。
流是整个网络流问题的核心所在,它实际上是定义在流网络上的一个线性函数,在流网络中,每条边都有一个流量
流量
(1)容量限制:
(2)流量平衡:对于一个
许多时候我们要求的答案满足二分性,通过网络流算法验证解,二分答案是建模前常用的手段,有的时候二分答案的复杂度可能不如直接一个一个答案枚举来的优,这时候我们不如选择枚举答案
这是解决平面图上问题的最常见技巧,给定一个平面图,我们将原图中的面抽象成点,原来分割两个面的边就在对应的两个点之间连线,构造出原图的对偶图。
网络流的模型总体上分为三种:最大流,最小割和费用流
(尽管总是利用最大流和最大流—最小割定理来解决最小割问题,但两者在建模时的思考方向完全是不一样的)
流量平衡思想
大多数最大流模型都是基于这一思想,题目中有明显的等量/不等关系和变量(01变量非常常见),要求最优化一个函数(可以注意到这其实是线性规划问题)我们可以考虑抽取题目中的约束条件(等式/不等式)进行观察。
<1>要注意每条边都同时作为一个点的出边和一个点的入边,因此,每个变量必然同时关联两个等量关系,且分别出现在这两个等量关系的等号的左边和右边(或者是以一对相反数形式出现);
<2>如果点内部有限制(比如某个点自身的权值不能超过X等等),那么该点内部也“暗含”一个变量,此时就需要拆点(不一定拆成两个点,可能拆成更多的点),然后在拆出的点当中再连边,附加一些限制,然后再考虑流量平衡;
增广路思想
有时候原题的方案的得出可以很明显地分为一些阶段,每一阶段都会对一些变量(这些变量可能是实的也可能是虚设的)产生同样的效果值累加,而这些变量恰好有各自的限制,且互不关联。这刚好相当于网络中的一条从源点到汇点的一条增广路,对路上所有边的流量都会增加,且流量有各自限制(容量),且互不关联。
用增广路思想能够解释的模型往往是一个很明显的“物质路径”模型,某一种物质(可以是实的也可以是虚的)从源点往汇点“走”,边上的流量代表物质经过的量。
BZOJ 1458 士兵占领
大意:给定一个
解:棋盘行列相关是典型的流量平衡的应用,显然题目中视格子
BZOJ 1305 CQOI dance跳舞
大意:给定
解:假如已经知道了举行的舞会次数,对于每一个男生/女生就有两个约束,一个是配对过多少人,一个是配对过的不喜欢的人小于等于
经典问题:二分图最大匹配
BZOJ 1433 ZJOI2009 假期的宿舍 最大流
大意:给定一些人,有些人是在校学生,有些去学校探访,在校学生有些回家,一个人只能睡认识的人的床,求能不能睡下
解:在许多问题中我们需要刻画两个集合之间一一对应的关系,这就是二分图匹配。(集合中任意两个元素的配对是一般图匹配,不在讨论范围内)。
二分图最大匹配有匈牙利算法这样的经典做法,但网络流同样能解决这个问题,对于两个点集中的每个点,都有一个约束条件是邻边被选次数小于等于1,我们直接最大流解决。
BZOJ 3993 Sdoi2015 星际战争
大意:有
解:假如我们知道当前所有武器已经攻击了
经典问题:DAG最小链覆盖(可重复/不可重复)
大意:对于一条链来说,除了首尾,中间点都要满足入度=出度,且入度<=1,出度小于<=1,对于一个点,出度入度各有一个方程,拆点拆成二分图,由于点有要求至少经过一次,点内部有流量下界,然后就转化为下界最小可行流了
经典问题:混合图欧拉回路
BZOJ 2095 Poi2010 Bridges
解:有向图欧拉回路存在的充要条件是每个点入度=出度。
随意将原图中的无向边定向,我们可以算出当前每个点的入度与出度,对于一个入度>出度的点来说,它需要将指向它的(入度-出度)/2条边反向,对于一个出度大于入度的点来说,它需要将它指向的(出度-入度)/2条边反向,将所有边是否被反向视作0/1变量,每个点就可以得到一个等式,因此我们将入度>出度与出度>入度分为两个点集,一边连向源,一边连向汇,其他边按原图连边,最大流判断能否流满即可。
BZOJ 1930 Shoi2003 pacman 吃豆豆
大意:找两个不相交的二维上升点列使得两个人一共取到的点价值最大
解:假如有相交,交换两个人的终点就不相交了,所以不用管相交,然后就变成了多阶段的问题,拆点,设上界,构造源汇,一条增广路对应一种方案。
BZOJ 2055 80人环游世界
大意:给定
解:拆点设上下界,源点到汇点任意一条增广路对应于一个人的路径。
BZOJ 1449 JSOI2009 球队收益
大意:给定
解:发现费用是流量的下凸函数,差分即可。
BZOJ 1283 序列
大意:给出一个长度为
解:我们考虑约束条件,是若干个不等式
设
对于第
…
将相邻两式相减
得
…
…
发现这里面一个变量关联两个等式,就可以用费用流求该线性规划模型的最值了
最小割是选择流网络的某些边割开使得源汇不连通的最小代价,也就是说对于流网络中的每个点,最小割实际上做了最优代价的
一般我们默认S集为存在/选择集合,T集为不存在/不选择集合。
曾经看到过一篇博客说最小割的线性规划模型是这样的
min{
应该说具有一定的参考价值。
通常在最小割问题中我们都能看到以下几个元素
点权:可能是收益也可能是代价
一般来说题目都会要求我们最大化收益,这时候我们可以设想我们拿到了所有的收益,将问题转化为最小化代价,将收益点与S连,代价点与T连,与S割开表示放弃收益,与T割开表示付出代价。
依赖关系:例如i的存在要求某个集合
假如
附加权:对全集
(1)都在S集的额外收益(一般情况的代价不会做)
新建一个点表示
都在T集的额外收益(一般情况的代价不会做)
新建一个点表示
(2)对于一个二元组,
由于是二分图,我们可以将某一个点集连向S和T的容量交换,再在
(3)对于一个二元组,
(4)对于一个二元组,
方法同(2),正确性显然
BZOJ 2400 Optimal Marks
大意:给定一个无向图,一些点有权值,其它点的权值可以自己指定,要求指定这些点的权值,使每条边两边的点权异或值之和最小
解:异或值位与位独立,一位一位考虑,发现是01集合划分,一条边两端的点如果在不同集合种会有代价,利用(3)的建图即可
经典问题:最大权闭合子图
BZOJ 1565 NOI2009 植物大战僵尸
大意:给定一个
1.啃掉这个植物,获得收益
2.保护(
任何一个点的植物存活时,它左侧的所有植物都无法被攻击
求最大收益
解:最大权闭合子图,是在一个描述依赖关系的图中最优化选取点集得到最大收益
对于依赖关系,我们可以用之前所说的方式连边。
在此题中,依赖关系可能出现环,因此需要拓扑排序去环
BZOJ 3894 文理分科
大意: 给定一个
解:属于(1)
BZOJ 2965 保护古迹
大意:给定一个平面图以及一些点,求将1个、2个、3个……点围起来所需要的最小代价
解:平面图转对偶图,枚举围住那些点,找到它们在平面图中所在的面,转化为对偶图上的割
上面几个只是常见的,还有比较精妙的
BZOJ 3218 a + b Problem
解:要求在某个区间内不管有多少个白的只要有就只算一次,因此我们再建一个虚点
然后可持久化线段树优化构图
太神妙了不能多说
标签:
原文地址:http://blog.csdn.net/hbhcy98/article/details/51202000