Day 3 网络流

Day3 电子笔记(网络流):

备注:上午 网络流,下午 计算几何

线性规划(基于 单纯性 做法)可以代替网络流,但是难写、难理解

不需要 建模(比网络流好的地方),时间复杂度更玄学

Dinic 算法:

分层、多路增广,当前弧优化,复杂度:O(N2M)【主要是玄学,跑二分图特别快】

Dining(POJ 3281)

食物和饮料,S向牛连边,流量为1,饮料向T连边流量1,牛向食物连边,注意中间拆点

Collector’s Problem(UVA 10779)【必做】

每种贴纸建一个点,连边向T,流量为1,Bob从S出发,连边向贴纸,流量为贴纸数目,考虑交换:每个朋友建一个点,从Bob贴纸多的点出发,连边向朋友,朋友连边向自己多的贴纸,图中黑色点是 朋友

 

最小割:

定理:最小割==最大流

定义:删去一些边使得原图不连通,且要求山区的边权之和最小

NOI 2006 最大获利:

最后答案为 所有用户的收益和,减去建立中转站的费用

Course Selection(Codechef Dec 14):

每个课程拆成M个点,求最小扣分,

这样就满足了前置课程,又保证了最小割是最少扣分。

Happiness BZOJ 2127

正解:PDF上有    二元组的思想,只需要先考虑他们两者之间的关系(你可以先假设只有两个点),进而得出整体图

费用流:

Dinic的BFS 用 SPFA 替换

剪刀石头布(BZOJ 2597)

无序三元组 问题,这样不好求,可以来搞不是这样的情况,不是这样的情况最小,一相减就是原来的情况最大

此题较难,回去好好整理。

NOI 2008 志愿者招募:

原题见课件或者上网搜

PDF上讲解很好、不整理

所有的网络流题 都可以用 单纯型法  求解

流量平衡思想汇报(流入一个点的流量恒等于流出流量),常用于带区间的一些问题,可以推一些不等式、或者等式什么的。

BZOJ 1001 狼爪兔子:

最小费用 转 最短路

粉红色的线表示 割掉 红色边  粉红色变的权值等于其割掉的红色边得权值

Annual Parade(codechef PARADE):

Floyd 求出 任意两点之间的最短路,然后、、、、、、、

这个题 彻底听蒙蔽了~~~~  木治啊~~

k-Maximum Subsequence Sum(cf 280D):

题目大意:

给定一个长度为N的序列,共有M次操作。操作有两种:

1.    将数列中第i个元素改为X

2.    要在[l,r]中选出至多K个不相交的连续子数列,最所选出的所有数的和最大是多少。

n,m<=105,k<=20

正解:网络流证明正确性(有些难想)、支持区间取反的线段树维护(记录一下即可,暴力,并不需要可持久化)

线段树记录四个值:区间中最大值是多少(max),左边必须贴着左端点的最大值(lmax),另一个记录rmax,取反标记

上、下界网络流:

无源汇可行流:

从T到S连一条正无穷的边(这是上界,下界设为0),先来一遍可行流,然后在原图上再跑一边最大流。

首先建立一个源ss和一个汇tt,一般称为附加源和附加汇。

  对于图中的每条弧<u,v>,假设它容量上界为c,下界b,那么把这条边拆为三条只有上界的弧。

  一条为<ss,v>,容量为b;

  一条为<u,tt>,容量为b;

  一条为<u,v>,容量为c−b。

  其中前两条弧一般称为附加弧。

  然后对这张图跑最大流,以ssss为源,以tttt为汇,如果所有的附加弧都满流,则原图有可行流。

  这时,每条非附加弧的流量加上它的容量下界,就是原图中这条弧应该有的流量。

理解方法:

  对于原图中的每条弧,我们把c−b称为它的自由流量,意思就是只要它流满了下界,这些流多少都没问题。

  既然如此,对于每条弧<u,v>,我们强制给v提供b单位的流量,并且强制从u那里拿走b单位的流量,这一步对应着两条附加弧。

  如果这一系列强制操作能完成的话,也就是有一组可行流了。

  注意:这张图的最大流只是对应着原图的一组可行流,而不是原图的最大或最小流。(也许会相等,只是也许)

有源汇:

有源汇之可行流:

建模方法:

  建立弧<t,s>,容量下界为0,上界为∞。

  然后对这个新图(实际上只是比原图多了一条边)按照无源汇可行流的方法建模,如果所有附加弧满流,则存在可行流。

  求原图中每条边对应的实际流量的方法,同无源汇可行流,只是忽略掉弧<t,s><t,s>就好。

  而且这时候弧<t,s>的流量就是原图的总流量。

  理解方法:

  有源汇相比无源汇的不同就在于,源和汇是不满足流量平衡的,那么连接<t,s>之后,源和汇也满足了流量平衡,就可以直接按照无源汇的方式建模。

  注意:这张图的最大流只是对应着原图的一组可行流,而不是原图的最大或最小流。

有源汇之最大流:

建模方法:

  首先按照有源汇可行流的方法建模,如果不存在可行流,更别提什么最大流了。

  如果存在可行流,那么在运行过有源汇可行流的图上(就是已经存在流量的那张图,流量不要清零),跑一遍从s到t的最大流(这里的s和t是原图的源和汇,不是附加源和附加汇),就是原图的最大流。

  理解方法:

  为什么要在那个已经有了流量的图上跑最大流?因为那张图保证了每条弧的容量下界,在这张图上跑最大流,实际上就是在容量下界全部满足的前提下尽量多得获得“自由流量”。

注意,在这张已经存在流量的图上,弧<t,s>也是存在流量的,千万不要忽略这条弧。因为它的相反弧<s,t>的流量为<t,s>的流量的相反数,且<s,t>的容量为0,所以这部分的流量也是会被算上的。

有源汇之最小流:

建模方法:

  首先按照有源汇可行流的方法建模,但是不要建立<t,s><t,s>这条弧。

  然后在这个图上,跑从附加源ss到附加汇tt的最大流。

  这时候再添加弧<t,s>,下界为0,上界为∞。

  在现在的这张图上,从ss到tt的最大流,就是原图的最小流。

理解方法:

  我们前面提到过,有源汇可行流的流量只是对应一组可行流,并不是最大或者最小流。

  并且在跑完有源汇可行流之后,弧<t,s>的流量就是原图的流量。

  从这个角度入手,我们想让弧<t,s>的流量尽量小,就要尽量多的消耗掉那些“本来不需要经过<t,s>”的流量。

  于是我们在添加<t,s>之前,跑一遍从ss到tt的最大流,就能尽量多的消耗那些流量啦QwQ。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七情六欲·

学生党不容易~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值