网络流(多样的建模)

来源:互联网 发布:java意见反馈模块 编辑:程序博客网 时间:2024/05/16 09:27

yhzq的总结是非常好的:
网络流总结

然而博主也不是一个只会复制链接的人,还是要有一点自己的感悟的

网络流问题最重要的就是建模和模型转换,下面就给出一些

经典模型

一、最大流

多源多汇问题

源有多个,汇也有多个,流可以从任意源流出,最终可以流向任意汇,
总流量等于所有源流出的总流量(所有汇流入的总流量)

解:加一个超级源点S,和超级汇点T,
从S向每一个源点引一条有向弧,容量为INF,每个汇点向T引一条有向弧,容量为INF
这里写图片描述

结点容量

每个结点都有一个允许通过的最大流量

解:把每个结点分裂成两个 x1,x2,中间连一条弧,容量等于x的结点容量
这里写图片描述

无源无汇有容量下界网络的可行流

不仅无源无汇,而且每条流量既有上界c又有下界b,所有结点都应满足“入流=出流”

解:由于我们只需要求出可行解即可,
可以增加超级源点S,和超级汇点T
然后对弧进行改造:首先添加弧T—>S并设容量为无穷大
然后把每条下界为b的弧拆成3条(如图1),然后合并(如图2)
这里写图片描述
用改造后的图求最大流即可
当且仅当所有附加弧满流的时候原网络有可行流

有容量下界网络的s-t最大/最小流

容量同时有上下界,且有源点和汇点各一个,求s到t的最大最小流

解:先用上题的解法求出可行流,

  • 用传统的增广路方法即可得到s-t最大流
  • t看做源点s看做汇点,求出的t-s最大流就是s-t最小流

注意

原先每条弧的反向弧u—>v的反向弧容量为0,
而在有容量下界的时候,反向弧的容量应该为容量下界

二、费用流

费用与流量的平方成正比的最大流

容量c均为整数,并且每条弧还有一个费用系数,
表示该弧的流量为x时,费用为ax^2

解:拆边法,一个费用系数为a,容量为5的边被拆成容量为1,费用各异的5条边
这里写图片描述
因为求的是最小费用,所以如果这条弧的流量是1,走的肯定是cost=1这条边
流量为2时,走的是cost=1和cost=3这两条边
不管流量是1,2,3,4,5中的哪一个,左右两个图都是等价的
所以原问题就变成了最小费用最大流

流量不确定的s-t最小费用图

网络中的费用有正有负,而且流量不固定

  • 如果费用都是正的,最小费用显然就是0流
  • 如果费用有正有负,那么一开始增广的时候,费用会逐渐变小,
    但是随着增广的进行,增广路权值会逐渐增大,最后变成正数,此时应该停止增广
    换句话说,费用随着增广,先下降,后上升,呈一下凸函数
    一般来说,下凸函数的最优解应该使用三分
    但是我们大可不必这么麻烦:
    只需在最短增广路费用为正的时候停止增广就好了

典型例题

1 . 二分图带权最大独立集

给出一个二分图,每个结点上都有一个正权值,要求选出一些点,使得这些点之间没有连边,且权值和最大

解:这道题我们需要用到最小割等于最大流的想法
割掉一条边表示我们舍弃ta的贡献
最后答案就是权值和-最大流(最小割)
这里写图片描述

2 . 公平分配问题

有m个任务,分配给n个处理器,其中每个任务有两个候选处理器,可以任选一个分配,
要求所有处理器中,分配任务最多的处理器分配的任务尽量少

解:又有最大值最小这样的字眼,我们就要二分答案
对于一个二分出来的x,我们建图:
二分图,X部是任务,Y部是处理器,源点向每个任务连容量为1的边
任务和处理器之间相应连边,处理器向汇点连容量为X的边
只有最大流跑出的答案是m,X才合法
这样我们只需要O(logm)次最大流就可以解决这个问题了

3 . 区间k覆盖问题

数轴上有一些带权值左闭右开的区间,选出权值和最大的一些区间,使得任意一个数被覆盖的次数不超过k

解:本题可以用最小费用流解决
构图方式:把每个数看做是一个结点,对于权值为w的区间[u,v)加边u—>v,容量为1,费用是-w
再对所有相邻结点连边i—>j,容量是k,费用是0
最后求最左点到最右点的最小费用最大流就可以了
其中每一个流量对应对应一组互不相交的区间
如果数值范围太大,可以离散化一下

4 . 最大闭合子图

给定带权图G(权值可正可负),求一个权值最大的子图,使得起点在该点集中,终点也在该点集中

解:新建一个源点和汇点,从源点向所有正权点连一条边,容量为权值
从所有的负权点向汇点连一条边,容量为权值的相反数
求出最小割(最大流),S-{s}就是最大闭合子图

这么说好像不大明白:
首先有一个有向连通图,每个点带有一个权值,例如:
这里写图片描述
此时,构建一个超级源点s,一个超级汇点t,所有的点按权值的正负连接到s和t上,转换成一个边权值有向图,如下图:
这里写图片描述

注:点权为0的点可以忽略,对结果没有影响

这时,可以得到结论:

① 该带边权有向图的关于s-t最小割,是简单割

  简单割:割集中所有的边,都与s或t相连接
  显然的,因为不与s,t相连的边,权值都是INF,最小割不可能割在INF的边上

② 最小割将整个网络分成两个点集合(一个是S能到的,一个是能到T的

③ S所在的集合(除去S)即为最大权闭合子图

这里写图片描述  
这里写图片描述        
简单的证明

最后,我们就有了求解这类问题的完整思路:

①先记录整个图中,所有正点权值的和
②建立对应流网络,求最大流,最大流在数值上等于最小割,故我们得到了流网络的s-t最小割;
“所有正点权值的和”减去“s-t最小割”,即得最大权闭合子图的权值和。

原创粉丝点击