zoukankan      html  css  js  c++  java
  • [NetworkFlow]网络流建模相关

    网络流问题本质上是线性规划问题的应用之中的一个,线性规划问题的标准形式是给出一组等式约束和不等式约束。要求最优化一个线性函数。
    在流问题中,变量以流量的形式出如今问题中,我们给出一个流网络(以有向图的形式)来解决有关流的问题。
    流是整个网络流问题的核心所在,它实际上是定义在流网络上的一个线性函数,在流网络中,每条边都有一个流量f(u,v)。流f=vVf(S,v)
    流量f(u,v)是流问题中的变量,它有两个约束,一个是不等式。一个是等式
    (1)容量限制:f(u,v)c(u,v)
    (2)流量平衡:对于一个uvVf(u,v)=0

    简单技巧

    二分答案/枚举答案

    很多时候我们要求的答案满足二分性。通过网络流算法验证解,二分答案是建模前经常使用的手段,有的时候二分答案的复杂度可能不如直接一个一个答案枚举来的优,这时候我们不如选择枚举答案

    平面图与其对偶图的转换

    这是解决平面图上问题的最常见技巧。给定一个平面图,我们将原图中的面抽象成点,原来切割两个面的边就在相应的两个点之间连线,构造出原图的对偶图。

    模型

    网络流的模型整体上分为三种:最大流。最小割和费用流
    (虽然总是利用最大流和最大流—最小割定理来解决最小割问题,但两者在建模时的思考方向全然是不一样的)
    流量平衡思想
    大多数最大流模型都是基于这一思想,题目中有明显的等量/不等关系和变量(01变量非经常见),要求最优化一个函数(能够注意到这事实上是线性规划问题)我们能够考虑抽取题目中的约束条件(等式/不等式)进行观察。
    <1>要注意每条边都同一时候作为一个点的出边和一个点的入边,因此,每一个变量必定同一时候关联两个等量关系。且分别出如今这两个等量关系的等号的左边和右边(或者是以一对相反数形式出现)。
    <2>假设点内部有限制(比方某个点自身的权值不能超过X等等),那么该点内部也“暗含”一个变量。此时就须要拆点(不一定拆成两个点,可能拆成很多其它的点)。然后在拆出的点当中再连边,附加一些限制。然后再考虑流量平衡。
    增广路思想
    有时候原题的方案的得出能够非常明显地分为一些阶段。每一阶段都会对一些变量(这些变量可能是实的也可能是虚设的)产生相同的效果值累加,而这些变量恰好有各自的限制,且互不关联。

    这刚好相当于网络中的一条从源点到汇点的一条增广路。对路上全部边的流量都会添加,且流量有各自限制(容量),且互不关联。


    用增广路思想能够解释的模型往往是一个非常明显的“物质路径”模型,某一种物质(能够是实的也能够是虚的)从源点往汇点“走”。边上的流量代表物质经过的量。

    最大流


    BZOJ 1458 士兵占据
    大意:给定一个mn的棋盘,当中k个点有障碍,要求放置最少的士兵,使第i行有至少L[i]个。第j列有至少C[j]
    :棋盘行列相关是典型的流量平衡的应用,显然题目中视格子(i,j)0/1变量。每行每列都各有一个不等式,题目要求的是0/1变量的总和最小,将行列看作二分图。那么就转化为了下界最小可行流了


    BZOJ 1305 CQOI dance跳舞
    大意:给定n个男生和n个女生。一些互相喜欢而一些不,举行几次舞会。每次舞会要配成n对。不能有相同的组合出现,每一个人仅仅能与不喜欢的人跳k次舞。求最多举行几次舞会
    :假如已经知道了举行的舞会次数,对于每一个男生/女生就有两个约束。一个是配对过多少人,一个是配对过的不喜欢的人小于等于k。我们对于每一个点首先源向它连舞会次数容量的边,然后设置若干条容量为1的边连向喜欢的女生,再连向一个虚结点容量为k(这里描写叙述了第一个约束),虚结点向不喜欢的女生连容量为1的边(这里描写叙述了第二个约束)。然后假设该图最大流能流满。说明当前舞会次数下存在可行方案,我们发现舞会次数满足二分性。于是二分答案。


    经典问题:二分图最大匹配
    BZOJ 1433 ZJOI2009 假期的宿舍 最大流
    大意:给定一些人。有些人是在校学生。有些去学校探訪,在校学生有些回家,一个人仅仅能睡认识的人的床,求能不能睡下
    :在很多问题中我们须要刻画两个集合之间一一相应的关系,这就是二分图匹配。

    (集合中随意两个元素的配对是一般图匹配。不在讨论范围内)。


    二分图最大匹配有匈牙利算法这种经典做法,但网络流相同能解决问题。对于两个点集中的每一个点,都有一个约束条件是邻边被选次数小于等于1,我们直接最大流解决。


    BZOJ 3993 Sdoi2015 星际战争
    大意:有n个机器人和m个激光武器。每一个武器有一个威力和能打的集合,同一时刻仅仅能打一个机器人。问最少多久能够全灭
    :假如我们知道当前全部武器已经攻击了t的时间,那么对于每一个武器我们都知道它的总输出是多少。对于每一个武器和机器人我们都能够列出一个等式,二分图构图,二分这个时间t就可以


    经典问题:DAG最小链覆盖(可反复/不可反复)
    大意:对于一条链来说。除了首尾。中间点都要满足入度=出度,且入度<=1,出度小于<=1,对于一个点,出度入度各有一个方程,拆点拆成二分图,因为点有要求至少经过一次。点内部有流量下界。然后就转化为下界最小可行流了


    经典问题:混合图欧拉回路
    BZOJ 2095 Poi2010 Bridges
    :有向图欧拉回路存在的充要条件是每一个点入度=出度。
    随意将原图中的无向边定向,我们能够算出当前每一个点的入度与出度,对于一个入度>出度的点来说。它须要将指向它的(入度-出度)/2条边反向,对于一个出度大于入度的点来说。它须要将它指向的(出度-入度)/2条边反向,将全部边是否被反向视作0/1变量,每一个点就能够得到一个等式。因此我们将入度>出度与出度>入度分为两个点集,一边连向源,一边连向汇,其它边按原图连边,最大流推断是否能流满就可以。

    费用流


    BZOJ 1930 Shoi2003 pacman 吃豆豆
    大意:找两个不相交的二维上升点列使得两个人一共取到的点价值最大
    解:假如有相交,交换两个人的终点就不相交了,所以不用管相交。然后就变成了多阶段的问题,拆点,设上界,构造源汇,一条增广路相应一种方案。


    BZOJ 2055 80人环游世界
    大意:给定n个点,每一个点有固定的经过次数,m个人从随意节点出发随意节点结束。仅仅能向右走,要求总边权和最小
    解:拆点设上下界。源点到汇点随意一条增广路相应于一个人的路径。


    BZOJ 1449 JSOI2009 球队收益
    大意:给定n支球队,第i支球队已经赢了wini场。输了losei场,接下来还有m场比赛,每一个球队终于的收益为Cix2i+Diy2i。当中xi为终于的胜场。yi为终于的负场
    解:发现费用是流量的下凸函数。差分就可以。


    BZOJ 1283 序列
    大意:给出一个长度为N的正整数序列ci,求一个子序列,使得原序列中随意长度为M的子串中被选出的元素不超过K(K,M<=100)个,而且选出的元素之和最大。
    解:我们考虑约束条件,是若干个不等式
    a[i]为第i个数是否选,v[i]为第i个数的值
    对于第i个不等式,加入辅助变量y[i]。将不等式变为等式
    a[1]+a[2]++a[n]+y[1]=k
    a[2]+a[3]++a[n+1]+y[2]=k

    a[2n+1]+a[2n+2]++a[3n]+y[2n+1]=k
    ans=max{a[i]v[i]}
    将相邻两式相减

    a[1]+a[2]++a[n]+y[1]=k
    y[1]+a[1]=a[n+1]+y[2]
    y[2]+a[2]=a[n+2]+y[3]

    y[n+1]+a[n+1]=a[2n+1]+y[n+1]

    y[2n]+a[2n]=a[3n]+y[2n+1]
    a[2n+1]+a[2n+2]++a[3n]+y[2n+1]=k
    发现这里面一个变量关联两个等式。就能够用费用流求该线性规划模型的最值了

    最小割

    最小割是选择流网络的某些边割开使得源汇不连通的最小代价。也就是说对于流网络中的每一个点,最小割实际上做了最优代价的ST集合划分。


    一般我们默认S集为存在/选择集合,T集为不存在/不选择集合。
    以前看到过一篇博客说最小割的线性规划模型是这种
    min{ max{(xixj,0)Wi}
    应该说具有一定的參考价值。


    通常在最小割问题中我们都能看到下面几个元素
    点权:可能是收益也可能是代价
    一般来说题目都会要求我们最大化收益,这时候我们能够设想我们拿到了全部的收益,将问题转化为最小化代价。将收益点与S连,代价点与T连,与S割开表示放弃收益,与T割开表示付出代价。
    依赖关系:比如i的存在要求某个集合prei都存在
    假如i的存在依赖于j。也就是说不同意存在i与S联通但j与T连通的情况,我们利用割的方向性,构建一条i>jINF的边。那么这样一旦出现i与S联通但j与T连通的情况,这条边会造成S->T的一个通路。这时候必须选择放弃i或选择j
    附加权:对全集U的某个子集u,它们互相之间存在/或不存在的关系会带来收益/代价
    (1)都在S集的额外收益(普通情况的代价不会做)
    新建一个点表示u。从源向u连边,容量为额外收益,从新点向u中全部点连边。容量为INF,不同意割开。这样一旦这个集合里有一个与T相连。这条额外收益边就必须被放弃,否则就必须把集合里全部点与T割开。
    都在T集的额外收益(普通情况的代价不会做)
    新建一个点表示u。从u向汇连边,容量为额外收益,u中全部点向新点连边,容量为INF,不同意割开,正确性同上
    (2)对于一个二元组,i在S(T)同一时候j也在S(T)的代价(且图是二分图)
    因为是二分图,我们能够将某一个点集连向S和T的容量交换,再在ij之间连双向边就可以
    (3)对于一个二元组,i在S j在T的代价
    ij连一条边,容量为代价。正确性同上。
    (4)对于一个二元组,i在S j在T的收益
    方法同(2),正确性显然


    BZOJ 2400 Optimal Marks
    大意:给定一个无向图。一些点有权值,其它点的权值能够自己指定。要求指定这些点的权值。使每条边两边的点权异或值之和最小
    :异或值位与位独立。一位一位考虑,发现是01集合划分,一条边两端的点假设在不同集合种会有代价。利用(3)的建图就可以


    经典问题:最大权闭合子图
    BZOJ 1565 NOI2009 植物大战僵尸
    大意:给定一个mn的草坪,每块草坪上的植物有两个属性:
    1.啃掉这个植物,获得收益x(可正可负)
    2.保护(r,c)点的植物不被啃掉
    不论什么一个点的植物存活时,它左側的全部植物都无法被攻击
    求最大收益
    :最大权闭合子图,是在一个描写叙述依赖关系的图中最优化选取点集得到最大收益
    对于依赖关系。我们能够用之前所说的方式连边。


    在此题中,依赖关系可能出现环,因此须要拓扑排序去环


    BZOJ 3894 文理分科
    大意: 给定一个mn的矩阵。每一个格子的人能够学文或者学理。学文和学理各有一个惬意度,假设以某人为中心的十字内全部人都学文或者学理还会得到一个额外惬意度,求最大惬意度之和
    解:属于(1)


    BZOJ 2965 保护古迹
    大意:给定一个平面图以及一些点,求将1个、2个、3个……点围起来所须要的最小代价
    :平面图转对偶图,枚举围住那些点,找到它们在平面图中所在的面。转化为对偶图上的割


    上面几个仅仅是常见的。还有比較精妙的


    BZOJ 3218 a + b Problem
    :要求在某个区间内无论有多少个白的仅仅要有就仅仅算一次。因此我们再建一个虚点
    然后可持久化线段树优化构图
    太神妙了不能多说

    附:上下界网络流构图

    无源汇上下界可行流

    我们须要想办法转化为有源汇。考虑流量都为g[,]且容量为C[,]B[,]的网络。
    为了不忽略B[,]这一条件,我们把g[,]强制满足下界B[,]。可是这时候整个流网络未必满足流量平衡
    我们採取这个方案来解决流量平衡:
    加入附加源汇S,T。对于某点u, 设in(u)=(B[i,u])(B[u,j])
    in(u)<0u>T 连容量为 in(u)的边
    in(u)>0S>u 连容量为 in(u)的边
    然后再 对于随意边(u,v) 连一条C[u,v]B[u,v]的边.
    这样 仅仅需对新的网络求一遍最大流就可以. 若出附加源点的边都满流即是存在可行流,反之不然.

    有源汇上下界可行流

    从汇点到源点连一条上限为INF。下限为0的边. 依照无源汇的上下界可行流一样做就可以

    有源汇上下界最大流

    从汇点T到源点S连一条上限为INF,下限为0的边,变成无源汇的网络. 照求无源汇可行流的方法,建附加源点S与汇点T,求一遍S>T的最大流. 再把从汇点T到源点S的这条边拆掉 . 求一次从ST的最大流就可以. (关于S,T的边能够不拆)

    有源汇上下界最小流

    照求无源汇可行流的方法,建附加源点ST,求一遍S>T的最大流. 可是注意这一遍不加汇点到源点的这条边. 求完后。再加上那条汇点到源点上限INF的边. 因为这条边下限为0。所以S,T无影响. 再直接求一遍S>T的最大流. 若ST>S边上的流量即为答案原图最小流,否则若不全满流即无解.

  • 相关阅读:
    Cocos2d-x教程(34)-三维物体OBB碰撞检測算法
    POJ 2485 Highways 最小生成树 (Kruskal)
    LintCode-分糖果
    云存储市场布局已定,怎样助力企业互联网转型
    HDU 1853 Cyclic Tour(最小费用最大流)
    windows下基于bat的每1分钟执行一次一个程序
    python中匹配中文,解决不匹配,乱码等问题
    bytes,packet区别 字节数据包
    wmic
    paramiko 模块封装
  • 原文地址:https://www.cnblogs.com/llguanli/p/8465377.html
Copyright © 2011-2022 走看看