zoukankan      html  css  js  c++  java
  • 网络流模型整理·改

    转载请注明原文链接:http://www.cnblogs.com/LadyLex/p/7601119.html 

    似乎自己之前整理过一点点网络流的东西

    但是最近看了几道题目之后发现自己还是太菜了

    那么让我们继续整理吧!下面是我目前所学,不定期更新!


    通用科技

    拆点

    如果对于点有一定的限制,或者我们的问题中还涉及了时间,

    我们可以考虑拆点来解决,比如某个点的经过次数,或者时间的分层图,

    或者把1个点拆成n个,用最小割来表示选择……都可以通过拆点连边来表示限制条件.

    放缩

    精度要求不高的实数流可以通过放缩的方式计算,即乘以大倍率再除去

    黑白染色

    见到棋盘先来一套黑白染色冷静一下就好了

    棋盘题千万不要忘记黑白染色!

    数据结构优化建图

    似乎2-sat也可以这么玩

    举个最简单的例子:如果我们的边是对某个区间里面的每个点都要联边,

    我们就可以建个线段树,向对应区间联边,线段树节点之间再联边,

    这样就可以让边数从$n^{2}$变成$nlogn$

    前后缀优化建图

    似乎2-sat也可以这么玩

    在某些情况下,可能一系列元素中只能选取一个

    那在2-sat里面,点从“x为真/假”变成了“前x个为真/假”

    网络流里面也可以类似进行操作,

    我们就不用从这个点向每个点都联边了,一串inf连下去即可

    inf边/反向inf边

    这个多见于最小割/最大权闭合子图中

    我们的inf边可以代表“两者只能选择一个”,即割掉两者中的一个,

    或者“选择a必须选择b”,然后用到最大权闭合子图里面

    费用递增

    如果对于某条边,其费用是关于流量的一个函数,并且满足他斜率是单调增加的,我们就可以拆边,第x条费用设为$f(x)-f(x-1)$

    这样由于我们跑最小费用,每次就会找最小的,流了x时就能正好计算了对应的f(x)

    合并

    似乎一个不错的建模方法是先建个暴力图,然后看看能不能减少其中的点来优化我们的图

    规律1. 如果几个结点的流量的来源完全相同,则可以把它们合并成一个。

    规律2. 如果几个结点的流量的去向完全相同,则可以把它们合并成一个。

    规律3. 如果从点u到点v有一条容量为∞的边,并且点v除了点u以外没有别的流量来源,则可以把这两个结点合并成一个。

    平面图转对偶图

    这个……我不是很会

    平面图的最小割就对应了对偶图的最短路

    转对偶一般使用对象还是网格图,或者有特殊结构的图(看题),

    总之要求可以很容易的给每个联通块编号,并且能用什么东西代表它

    一开始我以为这东西就是个狼抓兔子

    最后发现事情不太对……平面图转对偶图不仅仅这么简单

    由于最短路的复杂度一般是比网络流优秀的

    所以……如果一张图可以转对偶,原来的解法边点又很多,那么我们不妨试试转对偶

    Hall定理

        ??????

        不会!留坑待填!

    回路限制

    这种题之前见过两道,都是非常裸的那种

    一般都是说“要用回路覆盖整个网络”,然后我们限制每个点度数必须为2

    可是……今天见了个新题

    如果每个点可以选进回路可以不选,每种连边方式有权值,然后要求最大权呢?

    怎么感觉这两个都这么像插头DP啊23333

    考虑使用费用流,我们当然先黑白染色

    然后……我们可以把回路原来的边确定一个方向,比如说纵向边必须黑连白,横向必须白连黑

    这样我们把每个点拆为2点x1和x2,连$S-->x1-->x2-->T$,流量为1费用为0

    这条x1-->x2的边代表不选

    然后我们把原图中有向边对应的x1连向y2,流量1,费用为对应费用

    这样如果有一个x1-->y2被流了,x2和y1就都需要另外一个来流它

    由于我们跑的费用流的前提是最大流,因此这样我们求出来的解不会存在某个点度数不合法的情况

    这样很是妙啊……考场上没有想到拆点处理


    最大流

      有关题目:

    bzoj1711 bzoj1458 bzoj3993

    bzoj2095最大流求混合图欧拉回路

    这个问题的做法算一个小idea:我们可以用流量来表示“需求量/改变量”等值,

    然后通过是否满流来判是否存在合法分配方案


    最小割

    似乎首先我们需要一些定理……

      最大流最小割定理

        也就是说一张图最大流等于最小割。

        感性理解一下的话……你想,最大流是小于等于割的……

        你一个最大流拍上去,S到T就已经不存在通路了……

      最小割唯一性定理

      我们需要考虑两个东西:一条边可不可能在最小割中,和一条边一不一定在最小割中

       在你跑完一遍最小割之后,在割集上的边是一定满流的

       我们给残量网络跑tarjan缩点,如果一条边可能在最小割中,那么它的两端点不在同一个联通块里;

       如果一条边一定在最小割中,那么其(原图上)的起点会和S在一个联通块里,终点会和T在一个联通块里。

    经典用法

      最常见的模型是“每个决策有多种选择,我们选择其中的一个”这种问题

    最小割中的“割掉”就代表了“选择/不选择”

    这个代表选择还是不选择看你最后要最大还是最小……

    如果要最大,我们一开始先累加sum,再减去最小割

    因为建图之后如果有流量就证明存在冲突,

    没有流量的时候我们就用最小的代价消除了所有的冲突

    如果我们要最小,那就直接流,割掉的就是选择的

    但有的时候也可能会出现有三种或者更多种情况,我们只能选择其中之一

    这也好说:我们建一串点,这里面最小的一个就会被割掉

    文理分科模型

      如果点对之间的贡献不仅仅是点权,还有些附加条件(同时选,同时不选,一个选一个不选,blabla……)

    我们手动构造一下,由于“ 最小割中的“割掉”就代表了“选择” ”

    我们就讨论一下所有选择情况,使对应情况下被割掉的边流量之和等于权值

    这似乎被称作“文理分科模型”

    距离限制模型

      这是一种经典模型……因Hnoi的切糕一题得名“切糕模型”

      我们会有每个元素有多种选择,相邻两个元素之间的选择会相互限制

      比如切糕一题限制相邻两个点选择元素的下标不超过D

      这时,我们从每个下标x向下标x-D连一条inf的边

      如果相邻两个元素的距离超过D,那么必然会由于inf边的存在而存在其他通路,

    导致我们割掉权值更大的边

    但是切糕模型不仅仅可以这样用

    比如ctst2009的移民站选址,这题的模型就非常不错

    被称为切糕改23333

    现在相当于每个点有m种选择,每种选择有花费,

    但是不同点(比如i,j)的不同选择还会产生选择的标号差($|pi-pj|$)*特定常数($b(i,j)$)的花费

    这样我们把任意两个点的相同选择之间加上一条$b(i,j)$的双向边,

    如果i割掉了pi,j割掉了pj,那么这俩之间会出现$|pi-pj|$条流量为$b(i,j)$的边

    如果最终选择就是pi和pj,那么这$|pi-pj$|条边都会满流

    这样就满足了题给模型

    这样的确是很666的,我们通过利用最小割的性质(不存在通路),

    并且利用题给条件的特点(pi-pj)来考虑一种建模的改造:为限制距离的边加上权值

    总之挺神的……这题也不知道出题人怎么想出来的

    还有一种情况:和最短路有关的选择问题:即每个点到1最短路长度不同不同有不同收益

    这样的话,我们就把距离限制看成边,对于原图边$u->v$,我们转化为限制$|d_{u}-d{v}|<=1$

    然后开始跑就行了

    再来一个小问题:如果现在在网格图上,不是限制相邻两个的差不超过定值,而是限制和不超过定值呢?

    那么我们黑白染色,黑点建决策链从1到n,白点从n到1,这样的话就可以用之前差的连边方式处理和了。

    如何选择最大的元素:

      把原来的权值x变成maxn-x,maxn为一个大于全部x的值,

      这样割掉的最小边就是原来的最大值了,然后就可以了。这样建图的确很巧。

    如何处理损耗

      把一开始的流量设置为收益+损耗,累加的时候只加收益

      这样的话,我们如果最后的决策是损耗,答案就会贡献“收益-(收益+损耗)”= -损耗

    有关题目

    ---over----
    bzoj1001 bzoj1797 bzoj3144 bzoj3218
    bzoj1497 bzoj3996 bzoj2756 bzoj2127
    bzoj2039 bzoj3774
    ---waiting---
    bzoj4519 bzoj4435 bzoj2229 bzoj3681
    codeforces793G bzoj4957


    最大权闭合子图

      经典模型

    最常见的最大权闭合子图只是在最小割的基础上用inf边添加一些限制条件即可

    有的时候,最大权闭合子图做着做着会变成最小割

    也就是说,如果我们现在不是说“选x必须选y”,

    而是“我们可以选z之后选y,也可以选x之后选y”

    概括的说就是当我们用最大权闭合子图处理“或“的条件的时候

    朴素的做法行不通了

    这时候,我们可以考虑所有可能的情况,然后把他们串到一起跑最小割。

    并且串到一起的顺序也是有讲究的……不能串乱了

    ---over----

    bzoj1565 bzoj4873 bzoj4501 bzoj3438

    bzoj3232


    费用流

    序列限制问题:

      (据说这些都是用线性规划推出来的......我并不会)

      模型之一是k覆盖问题,给出一些带权区间,权值为a要求选出一部分使得每个数最多被k个区间覆盖并且所选区间权值和最大

        先把序列用流量为k的边串起来(S->1->2->3.......->n->T这样),这样限制了经过次数k

        接着为了选权值最大,我们由每个区间的左端点l向右端点右侧(r+1)连流量为1,权值为ai,然后跑一个最大费用最大流即可

        由于我们跑的费用流建立在最大流的基础上,因此每个点被覆盖的次数不会超过k次,否则就会在后续增广时反悔

      还有一个相似的模型是每个点有权值a,每个长度为m的区间最多能选k个,要求所选点权最大

        同样把序列串起来,然后对于每个点i向它后方第m+1个点连流量为1,费用为ai的边,同样跑一个最大费用最大流

        感性理解和上面那种建模类似,但是具体证明需要线性规划的知识......

      好吧我在这里写了写不用线性规划的理解方式……想看可以看一看

      其实这种模型可以概括为一类”核糖体+tRNA“模型(名字我自己起的233)

      也就是说,那个长度为m的区间就是移动的核糖体,我们从原点放出来k个tRNA(流量),

      然后对于每一个长度为m的操作区间,每个tRNA都只能操作一次

      这个操作的体现就是流经我们上面加的那个跳跃的边……然后他会跳到m个单位长度之后,那是第一个不包含它的区间

      然后在下面我们连一溜点,流量体现了我们对”不进行操作“的限制,即限制一段区间只能有一些tRNA不进行操作

      也就是说 我们通过下面的流量逼着tRNA去走上面的边

      然后大概就可以了,这样我们就能跑出来对应的限制

      当然,如果我们用线性规划的话,我们可以用把等式差分的方法来解决,不在这里讨论了。

    有关题目

    ---over----
    bzoj1877 bzoj2548 bzoj3876 bzoj2324

    bzoj2055 bzoj1070 bzoj4514 bzoj3171

    bzoj2879 bzoj3550 bzoj1283 codechef_SEP12_PARADE


    上下界

      不用说话,自己体会:http://www.cnblogs.com/liu-runda/p/6262832.html

      有关题目

    ---over----

    bzoj3876 bzoj2055 bzoj2502 bzoj4200 bzoj4213


    线性规划与网络流

      经典模型

    线性规划在网络流问题中的应用很是广泛,

    因为网络流问题可以把每个点/每条边的流入流出量看作变量,把最终答案看作目标函数来解决.

    这一部分的知识属于根本性的解决问题方法,掌握这种建模技巧肯定比背建模套路管用

    现在我暂时没有时间去学习这方面的知识......联赛之后这个坑一定要补上的.

    我回来补坑了

    线性规划和网络流的使用和上下界其实长得差不多……

    我们考虑,设$x_{i}$为每个变量是否选择,那么大概会有一串柿子像这样:

    $sum x_{j}>=A_{i}$

    首先我们转成等式…… 

    $sum x_{j}==y_{i}+A_{i}$

    我们加入2个等式$0==0$把这些等式差分

    $sum x_{j}-sum x_{k}==y_{i}+A_{i}-y_{i+1}-A_{i+1}$

    $sum x_{j}-sum x_{k}+y_{i+1}-y_{i}+A_{i+1}-A_{i}==0$

    然后……这个柿子的本质是流量平衡,减(-)代表流出,加(+)代表流入

    我们发现这个东西就是一堆常数项加上一堆变量对吧

    然后对于所有的元素 我们都满足一个原则:入正出负

    如果两个柿子有相同的变量,那么从负的那个(出)向正的那个(入)连边(辅助变量也算,连inf)

    然后如果一个常量x是正的,就由s向它连x;否则它向t连-x

    现在我们相当于要求一个可行流

    对于常量,我们建立附加源点和汇点,依然遵循入正出负连边

    有一种不用动脑子的记忆方法是移项到每个前面都是正的,然后一侧有变量代表出边,一侧代表入边

    然后对于附加源汇跑你想跑的流………

    上面费用流那个序列限制建模也可以用线性规划来理解

    有关题目

      ---over----
      bzoj1061 bzoj4842


    不清楚分类的题目:

    bzoj2095 bzoj4213 bzoj4067

    loj6045 loj2006 loj536 bzoj2229

    uoj217 uoj168 uoj77 bzoj2597

  • 相关阅读:
    Makefile 常用函数表
    情绪管理
    网赚呓语
    Gym 100952C&&2015 HIAST Collegiate Programming Contest C. Palindrome Again !!【字符串,模拟】
    Gym 100952B&&2015 HIAST Collegiate Programming Contest B. New Job【模拟】
    Gym 100952A&&2015 HIAST Collegiate Programming Contest A. Who is the winner?【字符串,暴力】
    HDU 1024 Max Sum Plus Plus【动态规划求最大M子段和详解 】
    HDU 1003 Max Sum【动态规划求最大子序列和详解 】
    HDU 1010 Tempter of the Bone【DFS经典题+奇偶剪枝详解】
    DFS中的奇偶剪枝学习笔记
  • 原文地址:https://www.cnblogs.com/LadyLex/p/7601119.html
Copyright © 2011-2022 走看看