【网络流】一类利用割的意义的网络流建模(加批注)

来源:互联网 发布:淘宝发帖推广怎么弄 编辑:程序博客网 时间:2024/05/16 11:21

一类利用割的意义的网络流建模

这几天在BZOJ漫无目的的闲逛。

今天逛到了第12页,那一群没写Source的题基本都是2011的命题答辩。

我顿时心花怒放,终于又见到有题解的题了。


膜拜了十几题下来,加上前不久见到的,就有看起来类似的网络流三发了...

稍微写一写吧。


先来看这么一个题。

给出一个无向图G=(V,E),并有定义在V上的权a和b,以及定义在E上的权w。

(这里提及的所有权都默认为非负整数。)

选出一个点集S,最大化∑(x属于S)a[x]+∑(x不属于S)b[x]+∑(x和y同时属于或不同时属于S)w(x,y)。

这是一个可以直接用最小割解决的问题。

添加源S和汇T,对于每个x,连边(S,x,a[x])和(x,T,b[x]),而w(x,y)直接变为对应边的容量。

考察这个图的割的意义不难得出最终的答案=∑a[x]+∑b[x]+∑w(x,y)-最小割。


好..我们来改一改。

现在我们需要最大的化的式子变成了这样。

∑(x属于S)a[x]+∑(x不属于S)b[x]+∑(x属于S且y不属于S)w(x,y)。

....很可惜似乎直接做是不可行的,如果有靠谱的做法请不吝赐教。

我们需要一个重要的条件:图G是二分图。

对于X中的每个点x,连边(S,x,a[x])和(x,T,b[x]);

对于Y中的每个点y,连边(S,y,b[y])和(y,T,a[y])。

而边权w(x,y)仍然直接变为对应边的容量。


下面来看另外一种改法。

新增一个定义在E上的权r。

最大化∑(x属于S)a[x]+∑(x不属于S)b[x]+∑(x和y都属于S)w(x,y)+∑(x和y都不属于S)r(x,y)。

(请留意,二分图的条件已经吃粑粑去了。)

回顾前面的解题过程,在考虑使用割的意义建图的时候,我们的割边实际上是“损失”。

在这一题中点权似乎仍然是老样子,但是边权有些麻烦了。

1. 当x和y同时属于S的时候,我们损失了r(x,y)。

2. 当x和y同时不属于S的时候,我们损失了w(x,y)。

3. 当x属于S和y属于S的真假性不同的时候,我们损失了w(x,y)以及r(x,y)。

正确的表达这些损失要用到的技巧是权值的重新分配。


首先,添加源S和汇T,对于每个x,连边(S,x,a[x])和(x,T,b[x])


考虑第1条,可以视为,当x属于S的时候,损失r(x,y)/2,y同理;

此时即要将x,y向T连各连一条r(x,y)/2的边,因为割的边代表损失的利益,而S连向x,y的边保留代表取此种方案。


第2条类似。 


而在第3条描述的情形下,根据前面已经做出的调整(根据前两条,已经割了S向x的边,y向T的边(或是S到y,x到T),我们就会计算出(r(x,y)+w(x,y))/2的损失;

然而真正的损失是w(x,y)+r(x,y),因此我们对x到y,y到x分别连上一条容量(r(x,y)+w(x,y))/2的边来补上这个损失。

这样一来所有的损失都被正确的计算了。


再来看一道有点像的题。

给定无重边无自环的无向图G=(V,E),定义在V上的权a,E上的权w,求一个点集S,最大化:

2*∑(x,y属于S)w(x,y)-∑(x属于S且y不属于S)w(x,y)-∑(x属于S)a[x]。

(为什么要乘2呢...∑枚举的x,y是无序的,但是根据题意w(x,y)和w(y,x)都要算进去)

令b[x]=∑(y)w(x,y),则∑(x属于S且y不属于S)w(x,y)=∑(x属于S)b[x]-2*∑(x,y属于S)w(x,y),

进而要最大化的式子变为 ∑(x,y属于S)4*w(x,y) - ∑(x属于S)(a[x]+b[x])。

很经典的最大权闭合图,这里略去。

但是这样搞总觉得有点脱离主题,于是我们再来看一个做法。

据∑w(x,y)=∑(x,y属于S)w(x,y)+∑(x,y不属于S)w(x,y)+∑(x属于S且y不属于S)w(x,y),将目标式化为

2*∑w(x,y) - 3*∑(x属于S且y不属于S)w(x,y)  - ∑(x属于S)a[x]。

从而只需要最小化 3*∑(x属于S且y不属于S)w(x,y) + 2*∑(x,y不属于S)w(x,y) + ∑(x属于S)a[x]。

而这个东西等于 ∑(y不属于S)w(x,y) + 2*∑(x属于S且y不属于S)w(x,y) + ∑(x属于S)a[x]。

(恩,2*∑(x,y不属于S)w(x,y)+∑(x属于S且y不属于S)w(x,y)=∑(y不属于S)w(x,y)看起来挺纠结的。)

不管怎么说弄成这样了以后就可以利用割的意义来构造了:

∑w(x,y)就是把y割出S的损失,a[x]就是把x割进S的损失,将x,y分开的损失则是2*w(x,y)。

于是直接最小割就完了。


(无视第一题)这三道题分别是:

bzoj 2132, tsinsen A1238 : 圈地计划(李其乐) 2011中国国家集训队命题答辩

bzoj 2127, tsinsen A1261 : happiness(吴确)  同上

bzoj 2039, tsinsen A1208 : 人员雇佣(林衍凯) 2010中国国家集训队命题答辩

感谢三位神牛对我间接的指导。


0 0
原创粉丝点击