网络流一般建模方式——最小割篇

来源:互联网 发布:剑灵男刺客捏脸数据图 编辑:程序博客网 时间:2024/06/05 15:38

前言:如果说网络流的难点在于建模,则最小割的难点还有一个——想到利用最小割,以及建出适用的最小割模型。一旦这两点搞定,就可以使用最小割=最大流定理解题了。

1,          直接使用定理

最小割释义:一个图中的一些边,使得删去这些边后整个图不连通,且这些边的总权值最小。

 

典型例题:太空飞行计划问题/方格取数问题/骑士共存问题

 

例题:

【tyvj1338】QQ农场

这个农场和游戏中略有不同。土地实际上是一个边长为N的正方形,由N*N块土地组成。
在每块土地上,都种有一种农作物。如果他选择摘取一块土地上的农作物,就能获得一个固定的利润(当然,这个利润是正数)。不同土地上的利润多半是不同的。
贪心的Sandytea本想摘取所有土地上的农作物。但是正当他准备行动时,却被告知不允许摘取了两块有公共边的土地上的作物,否则就会被主人的狗发现。
Sandytea
想知道,在不被狗抓住的前提下,他能获得的最大利益是多少。

 

题解:先对正方形黑白相间染色。能获得的利益最大化=不能获得的利益最小化。由源点向黑格连容量为格点权值的边,白格向汇点连容量为格点权值的边,每个格子向相邻的边连容量为inf的边,可以证明这张图的最小割即为最小不能获得的利益,然后跑最大流即可。

2,          最小割转最短路

有时点数过多,网络流会超时,得把最小割转成最短路问题。

理论:http://www.cnblogs.com/qzqzgfy/p/5578785.html

特殊图(网格形状)实现:

为锻炼读者思维,请自行实现。

【bzoj1001】[BeiJing2006]狼抓兔子

现在小朋友们最喜欢的喜羊羊与灰太狼”,话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形:  左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路1:(x,y)<==>(x+1,y) 2:(x,y)<==>(x,y+1) 3:(x,y)<==>(x+1,y+1) 道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的.左上角和右下角为兔子的两个窝,开始时所有的兔子都聚集在左上角(1,1)的窝里,现在它们要跑到右下解(N,M)的窝中去,狼王开始伏击这些兔子.当然为了保险起见,如果一条道路上最多通过的兔子数为K,狼王需要安排同样数量的K只狼,才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的狼的数量要最小。因为狼还要去找喜羊羊麻烦.

题解:裸最小割。数据过大,直接转对偶图最短路。

 

NOI2010海拔

YT市是一个规划良好的城市,城市被东西向和南北向的主干道划分为n×n个区域。简单起见,可以将YT市看作一个正方形,每一个区域也可看作一个正方形。从而,YT城市中包括(n+1)×(n+1)个交叉路口和2n×(n+1)条双向道路(简称道路),每条双向道路连接主干道上两个相邻的交叉路口。下图为一张YT市的地图(n = 2),城市被划分为2×2个区域,包括3×3个交叉路口和12条双向道路。Z作为该市的市长,他根据统计信息得到了每天上班高峰期间YT市每条道路两个方向的人流量,即在高峰期间沿着该方向通过这条道路的人数。每一个交叉路口都有不同的海拔高度值,YT市市民认为爬坡是一件非常累的事情,每向上爬h的高度,就需要消耗h的体力。如果是下坡的话,则不需要耗费体力。因此如果一段道路的终点海拔减去起点海拔的值为h(注意h可能是负数),那么一个人经过这段路所消耗的体力是max{0,h}(这里max{a,b}表示取a,b两个值中的较大值)。Z还测量得到这个城市西北角的交叉路口海拔为0,东南角的交叉路口海拔为1(如上图所示),但其它交叉路口的海拔高度都无法得知。小Z想知道在最理想的情况下(即你可以任意假设其他路口的海拔高度),每天上班高峰期间所有人爬坡所消耗的总体力和的最小值。

题解:通过读题可以知道结论:海拔高度不是0就是1,否则不会最优;且所有的0在左上角组成一个连通块,所有的1在右下角组成一个连通块,答案就是交界的长度。等于最小割。

有向边最小割转最短路:http://blog.csdn.net/orpinex/article/details/7171640

 

3,处理集合间的矛盾关系

例如选择A就不能选B。使收益最大化。

建立二分图模型,将矛盾关系抽象成边,通过最小割求最大收益。

 

例题:

【bzoj1934】[Shoi2007]Vote 善意的投票

幼儿园里有n个小朋友打算通过投票来决定睡不睡午觉。对他们来说,这个问题并不是很重要,于是他们决定发扬谦让精神。虽然每个人都有自己的主见,但是为了照顾一下自己朋友的想法,他们也可以投和自己本来意愿相反的票。我们定义一次投票的冲突数为好朋友之间发生冲突的总数加上和所有和自己本来意愿发生冲突的人数。我们的问题就是,每位小朋友应该怎样投票,才能使冲突数最小?

 

题解:连二分都不用。源点向所有赞成的人连容量为1的边,所有反对的人向汇点连容量为1的边,好朋友之间连容量为1的双向边,最小割即为答案。

证明:对于整个图来说,割掉一条从原点/汇点出发的边代表一个人违背自己,代价为1;割掉一条两个人之间的边代表两个人互相冲突,代价为1。由此可以看出要求的是最小割。

 

【bzoj2127】happiness

高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。

 

题解:喜悦值总和最大=未收获喜悦值总和最小。

对于某个人x:源点向x连容量为a[x]+ 他和四周的人都选文科的喜悦值/2的边;x向汇点连容量为a[x]+ 他和四周的人都选理科的喜悦值/2的边;x向旁边的所有点连容量为他们同时选文科+理科的喜悦值/2的边。

 

4,最大权闭合子图

对于一张图,每个点有点权,求权值和最大的闭合子图。

闭合子图定义:有向图 G = (V, E) 的子图 V ′ , 满足 V ′ 中所有出边指向的点仍属于 V ′。

单纯求法:点权为正连向源,点权为负连向汇,原图中的边容量均为无穷大。 求完最小割之后与源相连的点即为最大权闭合子图。

典型例题:太空飞行计划问题

例题:

 

【bzoj1391】[Ceoi2008]order

有N个工作,M种机器,每种机器你可以租或者买过来. 每个工作包括若干道工序,每道工序需要某种机器来完成,你可以通过购买或租用机器来完成。 现在给出这些参数,求最大利润。

 

题解:没有租用的情况就是太空飞行计划问题。

我们可以把租用的情况看成不购买但付出一定的代价。而且是一次性的。

只需把连接工作和机器的边权值从无穷大改成租用价格即可。

因为每个机器如果租用都得单独付费,割掉这条边就相当于租用一次。

最后用所有利润减最小割即可。

 

Codeforces #181 Div.1 E Biologist

n 个已经有初值的 0/1 变量,改变一个变量需要 vi 的花费。有 m 个需求,要求某个集合的变量均为 0/1,满足需求得到 wi 的收益。求最大收益。

 

题解:由于变量有初值,需要更改建模方式。

如果一个变量初值为0,向源点连容量为花费的边,反之向汇点连边。对于一个需求,为0向源点连容量为收益的边,反之向汇点连边。同时需求也向变量连容量为inf的边。

这张图的最小割即为最小花费。用所有收益之和减最小割即可。

 

 

总结:

最小割是一类思维难度较大的网络流模型。更多内容推荐胡伯涛的《最小割模型在信息学竞赛中的应用》 。希望读者以后也能靠自己的双手建出正确的最小割模型
1 0