有关网络流

有关网络流

1. 关于模板

  • 最大流通常Dinic就解决掉了
  • 费用流的话,通常EK都能搞出来,而后若是被卡了的话,就写一个相似Dinic的东西就行了,基本没啥变化,本身YY一下就想出来了

2. 关于最大流

普通最大流

彷佛没啥题,我见过的都是裸题php

有关最小割

关于最小割的东西仍是很多的,那么从头开始说网络

  1. 直接最小割数据结构

    这个东西通常都不是网络流题,可是一般网络流能够爆踩std...优化

    例子的话:BZOJ1001 狼抓兔子 NOI2010 海拔get

  2. 一块儿选一些点会发生一些事情it

    这种东西通常考新建一个虚点,而后把代价从原来的点连向这个点,而后向其余的点连流量为正无穷的边模板

    1. BZOJ 3894 文理分科变量

      上述问题的裸题,直接按照上述方式建图而后最小割便可技巧

    2. BZOJ 3774 最优选择map

      先黑白染色,而后白黑分别连向源汇,流量为$a[i][j]$,而后对于每一个点新建一个点,而后,对于白点新建一个点,把白点连向这个点流量为$b[i][j]$,对于黑点也新建一个点,而后把这个点连向黑点,流量为$b[i][j]$,而后对于每一个新建的点,而后把这个点连向四周的点或者从四周连向这个点便可。

    3. BZOJ 2400 Optimal Marks

      先拆位,由于每位之间的贡献是互不影响的,而后对于每一个有数字的节点,分为$0,1$,而后$S -> 0$,流量为$\infty$,$1 - > T$流量为$\infty$,剩下的对于原图中每个边练一下流量为$1$的边便可。这样的最小割即为第一问的答案,而后由于流是肯定的,因此贪心的找到必须为$1$的点的个数第二问就解决了

    4. BZOJ 3144 HNOI2013 切糕

      若是没有限制的话,显然能够建图,从底向上,多建出一层点,而后每条边的流量就是对应层的代价便可,而后加入$d$的限制以后,就只须要把每一个点连向旁边的深度比它大$d$的点,流量为$\infty$,道理很简单,这样若是$i$层的边被割了,那么就从这一层的$i+1$位置走到旁边的$i+1+d$的位置,而后而且会从$i-d$回到$i$这个位置,若是不在这个区间内割开的话,原图就仍是联通的。

    5. BZOJ 3218 a+b problem

      先把$S - > i$,流量为$b[i]$,而后把$i - > T$流量为$w[i]$,对于奇怪的方格的限制能够新建一个点,并把$i$指向这个点,流量为$p[i]$,而后再把这个点指向可能会致使这个点奇怪的点便可,流量显然为$\infty$。

  3. 最小割树

    咕咕咕

最大流常见建图方式

  1. 混合图欧拉回路

    随意钦定无向边方向,因为欧拉回路要求每一个点的入度等于出度,而且入读+出度为偶数

    因此对于每一个点,$S- > i$连一条出度流量的边,$i-> T$连一条入度流量的边,而后对于原图中的每一条无向边,因为能够反悔,因此假设你钦定了是$x->y$,连一条$x-> y$,流量为$2$的边便可,缘由很简单,由于能够反悔,因此对于每一个点若是出度较多,就须要把某一些出边变成入边,反之就须要把某一些入边变成出边,每次会让出边-入边的差减小$2$。

  2. 最大权闭合子图

    将每一个点权分正负,对于正点,$S->i$,流量为$a_i$,对于负边,$i->T$,流量为$-a_i$

    对于原图中的每一条边,$x->y$连一条流量为正无穷的边,而后正权边的和-最大流即为答案

  3. 最大密度子图

    经过01分数规划,咱们二分每一个点的代价,而后对于这个代价创建最大权闭合子图便可。

    每次验证最大权闭合子图是否为$0$便可

3. 关于费用流

普通费用流

通常这种题,费用流都不是正解,或者正解须要优化建图方式,这种题的费用流模型十分简单,而且费用流部分不做为考点存在

其中一部分是能够经过贪心+数据结构优化到$O(n\log n )$或者$O(n \log ^2 n)$

另外一部分则是一样经过数据结构或者其余的什么东西优化边数来优化复杂度

详情见:

常见费用流模型

  1. 最小等待时间问题

    通常的解决方案是拆点

    1. BZOJ 1070 修车

      这个题是这种题的一个常见形式,把$m$我的拆成$n$个点

      对于第$i$我的的第$k$个点,把这我的向第$j$个车连一条流量为$1$,费用为$map[j][k]\times i$

      这个道路很简单,表达的意义就是第$i$我的,倒数第$k$个修$j$这个车

      而后$S$向全部人连边,全部车向$T$连边

    2. BZOJ 2879 美食节

      和修车大概啥区别都没有,就是须要动态开点...

  2. 费用流拆边

    通常解决的问题长成,最小化$(x)^2$其中$(x)$是一个式子,而后能够经过建出$n$条费用不一样的边来解决

    BZOJ 2597 WC2007 石头剪刀布

    先把问题转化为,求三个点不构成环的方案数

    而后能够发现,对于这样的方案必定知足其中有两个点是指向同一个点

    那么也就是$C(n,3)-\sum\limits_{i=1}^nC(d[i],2)$

    而后最小化后者,转化为求最小化:$\sum\limits_{i=1}^n d[i]^2 - d[i]$

    能够发现后面的$d[i]$的和是固定的,也就是$\sum\limits_{i=1}^n i=\frac{n\times (n-1)}{2}$

    那么就是最小化$\sum\limits_{i=1}^nd[i]^2$,对每一个点拆边,费用分别为$1,3,5,7...$

  3. 线性规划转费用流

    “事实上任何最大流,最小费用流,上下界网络流都是在解决一个线性规划问题”(摘自 wyfcyx 大爷的ppt)

    具体地,在一个网络流问题中,把边看做变量,把点看做限制条件,就会获得一个线性规划问题。

    固然,因为网络流的特性,这类线性规划问题只能是:每一个变量出现次数为且仅为$2$次,且$1$次系数为$+1$,$1$次系数为$-1$。

    若是咱们可以将这类特殊的线性规划问题转化为网络流问题,就能够圆满地解决原问题。

    BZOJ1061: [Noi2008]志愿者招募

    咱们设:第$i$天招募的志愿者数量为$P_i$,$j$种志愿者招募了$k_j$个

    那么对于$P_i = P_{i-1}+ \sum\limits_{S_j=i} k_j - \sum\limits_{T_j=i-1}k_j $

    咱们要知足:$P_i \ge A_i$,因此咱们设$B_i $为一个天然数,即:$P_i = A_i+B_i$

    那么咱们能够获得:$P_i - P_{i-1} = A_i + B_i - A_{i-1} - B_{i-1}$

    将$P_i = P_{i-1}+ \sum\limits_{S_j=i} k_j - \sum\limits_{T_j=i-1}k_j $带入上式可得:

    $\sum\limits_{S_j=i} k_j - \sum\limits_{T_j = i-1}k_j = A_i +B_i -A_{i-1}-B_{i-1}$

    那么:$A_i+B_i + \sum\limits_{T_j =i-1}k_j = A_{i-1}+B_{i-1} + \sum\limits_{S_j=i}k_j $

    那么对于这样的一个式子,咱们发现,若是把招募$k$个志愿者看做流出流量,到期看做在下一天流入流量,同时把前一天看做是流出流量,当天所需看做是流入流量,而后再把这天多余的看成流出流量,而后把下一天的多余流量流入今天。

    这样若是每一个点都流量平衡就知足要求了,那么就按照上述东西跑一个费用流就行了。

4. 关于有上下界网络流

对于这种相似问题,若是原图有源汇,那么就把汇向源连一条当前网络可以容许的最大流量的边,而后剩下的就转化为无源汇问题了。

而后作题的技巧是,先建出对应的可行流模型

而后再可行流的模型上构建真正须要的模型

通常能够把连边的流量写成不等式或者等式的形式

有上下界可行流

对于这种问题,咱们能够转化为相似于混合图欧拉回路的方法解决。

也就是,咱们将每条边先钦定都流下界那么多的流量,而后有些点可能就会流量不平衡

这个时候,咱们将$S->i$若是流入>流出,而且流量为流入$-$流出,反之,咱们将$i->T$,流量为流出$-$流入

而后对于原图中的每一条边,由于每条边能够在上届与下界之间反悔,若是多流的话,表明着起始点的流入增长,终止点的流出增长,那么若是可以经过调整当前图的流量知足流量平衡,那么就能够,反之就不能够。

有上下界最大流

彷佛没啥养分?

通常问题都包含源汇,而后就能够把新建的源汇去掉,把汇向源的边去掉。

而后在残余网络上跑原图源汇直接的最大流便可

(其实这个有上下界一点意义都没有,这个本质上就是转化成了有上下界可行流判断可行性+若是可行,答案必定为原图最大流

有上下界最小流

和上面的求法同样,不过跑的是汇到源的最大流

而后可行流的流量减去这个流量就是最小流

有上下界最小费用可行流

直接用可行流模型边加上费用跑费用流就行

5. 一些习题

相关文章
相关标签/搜索