网络流题目+题解

网络流题目+题解
网络流题目+题解

网络流建模汇总 

by Edelweiss

目录

最大流 (4)

《POJ 1149 PIGS》 (4)

《POJ 1637 Sightseeing tour》 (8)

《POJ 2391 Ombrophobic Bovines》 (9)

《POJ 2699 The Maximum Number of Strong Kings》 (10)

《POJ 3281 Dining》 (11)

《JOJ 2453 Candy》 (11)

《ZOJ 2760 How Many Shortest Path》 (12)

《WOJ 1124 Football Coach》 (12)

《SGU 326 Perspective》 (13)

《SGU 438 The Glorious Karlutka River =)》 (14)

《SPOJ 287 Smart Network Administrator》 (14)

《SPOJ 962 Intergalactic Map》 (15)

《小结》 (15)

最小割 (15)

《HOJ 2634 How to earn more》 (16)

《HOJ 2713 Matrix1》 (16)

《POJ 1815 Friendship》 (17)

《ZOJ 2532 Internship》 (17)

《Ural 1277 Cops and Thieves》 (18)

《SPOJ 839 Optimal Marks》 (18)

《SPOJ 1693 Coconuts》 (19)

《Beijing Regional 2008 Problem A Destroying the bus stations》 (19)

《小结》 (20)

有上下界 (21)

《POJ 2396 Budget》 (21)

《小结》 (22)

最小费用流 (22)

《HOJ 2543 Stone IV》 (22)

《HOJ 2715 Matrix3》 (23)

《HOJ 2739 The Chinese Postman Problem》 (23)

《POJ 3680 Intervals》 (24)

《SPOJ 371 Boxes》 (24)

《BASHU 2445 餐巾问题》 (25)

《剪刀石头布》 (25)

《小结》 (26)

最大流

《POJ 1149 PIGS》

【题目大意】

有M个猪圈,每个猪圈里初始时有若干头猪。一开始所有猪圈都是关闭的。依次来了N个顾客,每个顾客分别会打开指定的几个猪圈,从中买若干头猪。每个顾客分别都有他能够买的数量的上限。每个顾客走后,他打开的那些猪圈中的猪,都可以被任意地调换到其它开着的猪圈里,然后所有猪圈重新关上。问总共最多能卖出多少头猪。(1 <= N <= 100, 1 <= M <= 1000)

举个例子来说。有3个猪圈,初始时分别有3、1和10头猪。依次来了3个顾客,第一个打开1号和2号猪圈,最多买2头;第二个打开1号和3号猪圈,最多买3头;第三个打开2号猪圈,最多买6头。那么,最好的可能性之一就是第一个顾客从1号圈买2头,然后把1号圈剩下的1头放到2号圈;第二个顾客从3号圈买3头;第三个顾客从2号圈买2头。总共卖出2+3+2=7头。

【建模方法】

不难想象,这个问题的网络模型可以很直观地构造出来。就拿上面的例子来说,可以构造出图1所示的模型(图中凡是没有标数字的边,容量都是∞):?三个顾客,就有三轮交易,每一轮分别都有3个猪圈和1个顾客的结点。

?从源点到第一轮的各个猪圈各有一条边,容量就是各个猪圈里的猪的初始数量。

?从各个顾客到汇点各有一条边,容量就是各个顾客能买的数量上限。

?在某一轮中,从该顾客打开的所有猪圈都有一条边连向该顾客,容量都是∞。

?最后一轮除外,从每一轮的i号猪圈都有一条边连向下一轮的i号猪圈,容量都是∞,表示这一轮剩下的猪可以留到下一轮。

?最后一轮除外,从每一轮被打开的所有猪圈,到下一轮的同样这些猪圈,两两之间都要连一条边,表示它们之间可以任意流通。

图1

这个网络模型的最大流量就是最多能卖出的数量。图中最多有

2+N+M×N≈100,000个结点。这个模型虽然很直观,但是结点数太多了,计算速度肯定会很慢。其实不用再想别的算法,就让我们继续上面的例子,用合并的方法来简化这个网络模型。

首先,最后一轮中没有打开的猪圈就可以从图中删掉了,也就是图2中红色的部分,显然它们对整个网络的流量没有任何影响。

图2

接着,看图2中蓝色的部分。根据我总结出的以下几个规律,可以把这4个点合并成一个:

规律1. 如果几个结点的流量的来源完全相同,则可以把它们合并成一个。

规律2. 如果几个结点的流量的去向完全相同,则可以把它们合并成一个。

规律3. 如果从点u到点v有一条容量为∞的边,并且点v除了点u以外没有别的流量来源,则可以把这两个结点合并成一个。

根据规律1,可以把蓝色部分右边的1、2号结点合并成一个;根据规律2,可以把蓝色部分左边的1、2号结点合并成一个;最后,根据规律3,可以把蓝色部分的左边和右边(已经分别合并成了一个结点)合并成一个结点。于是,图2被简化成了图3的样子。也就是说,最后一轮除外,每一轮被打开的猪圈和下一轮的同样这些猪圈都可以被合并成一个点。

图3

接着,根据规律3,图3中的蓝色结点、2号猪圈和1号顾客这三点可以合并成一个;图3中的两个3号猪圈和2号顾客也可以合并成一个点。当然,如果两点之间有多条同向的边,则这些边可以合并成一条,容量相加,这个道理很简单,就不用我多说了。最终,上例中的网络模型被简化成了图4的样子。

图4

让我们从图4中重新总结一下构造这个网络模型的规则:

?每个顾客分别用一个结点来表示。

?对于每个猪圈的第一个顾客,从源点向他连一条边,容量就是该猪圈里的猪的初始数量。如果从源点到一名顾客有多条边,则可以把它们合并成一条,容量相加。

?对于每个猪圈,假设有n个顾客打开过它,则对所有整数i∈[1, n),从该猪圈的第i个顾客向第i + 1个顾客连一条边,容量为∞。

?从各个顾客到汇点各有一条边,容量是各个顾客能买的数量上限。

?

拿我们前面一直在讲的例子来说:1号猪圈的第一个顾客是1号顾客,所以从源点到1号顾客有一条容量为3的边;1号猪圈的第二个顾客是2号顾客,因此从1号顾客到2号顾客有一条容量为∞的边;2号猪圈的第一个顾客也是1号顾客,所以从源点到1号顾客有一条容量为1的边,和之前已有的一条边合并起来,容量变成4;2号猪圈的第二个顾客是3号顾客,因此从1号顾客到3号顾客有一条容量为∞的边;3号猪圈的第一个顾客是2号顾客,所以从源点到2号顾客有一条容量为10的边。

新的网络模型中最多只有2 + N = 102个结点,计算速度就可以相当快了。可以这样理解这个新的网络模型:对于某一个顾客,如果他打开了猪圈h,则在他走后,他打开的所有猪圈里剩下的猪都有可能被换到h中,因而这些猪都有可能被h的下一个顾客买走。所以对于一个顾客打开的所有猪圈,从该顾客到各猪圈的下一个顾客,都要连一条容量为∞的边。

在面对网络流问题时,如果一时想不出很好的构图方法,不如先构造一个最直观,或者说最“硬来”的模型,然后再用合并结点和边的方法来简化这个模型。经过简化以后,好的构图思路自然就会涌现出来了。这是解决网络流问题的一个好方法。

《POJ 1637 Sightseeing tour》

【题目大意】

混合图欧拉回路。(1 <= N <= 200, 1 <= M <= 1000)

【建模方法】

把该图的无向边随便定向,计算每个点的入度和出度。如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路。因为欧拉回路要求每点入度= 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路。

好了,现在每个点入度和出度之差均为偶数。那么将这个偶数除以2,得x。也就是说,对于每一个点,只要将x条边改变方向(入>出就是变入,出>入就是

变出),就能保证出=入。如果每个点都是出=入,那么很明显,该图就存在欧拉回路。

现在的问题就变成了:我该改变哪些边,可以让每个点出=入?构造网络流模型。首先,有向边是不能改变方向的,要之无用,删。一开始不是把无向边定向了吗?定的是什么向,就把网络构建成什么样,边长容量上限1。另新建s和t。对于入>出的点u,连接边(u, t)、容量为x,对于出>入的点v,连接边(s, v),容量为x(注意对不同的点x不同)。之后,察看是否有满流的分配。有就是能有欧拉回路,没有就是没有。欧拉回路是哪个?察看流值分配,将所有流量非0(上限是1,流值不是0就是1)的边反向,就能得到每点入度=出度的欧拉图。

由于是满流,所以每个入>出的点,都有x条边进来,将这些进来的边反向,OK,入=出了。对于出>入的点亦然。那么,没和s、t连接的点怎么办?和s连接的条件是出>入,和t连接的条件是入>出,那么这个既没和s也没和t连接的点,自然早在开始就已经满足入=出了。那么在网络流过程中,这些点属于“中间点”。我们知道中间点流量不允许有累积的,这样,进去多少就出来多少,反向之后,自然仍保持平衡。

所以,就这样,混合图欧拉回路问题,解了。

《POJ 2391 Ombrophobic Bovines》

【题目大意】

给定一个无向图,点i处有Ai头牛,点i处的牛棚能容纳Bi头牛,求一个最短时间T使得在T时间内所有的牛都能进到某一牛棚里去。(1 <= N <= 200, 1 <= M <= 1500, 0 <= Ai <= 1000, 0 <= Bi <= 1000, 1 <= Dij <= 1,000,000,000)

【建模方法】

将每个点i拆成两个点i’, i’’,连边(s, i’, Ai), (i’’, t, Bi)。二分最短时间T,若d[i][j]<=T (d[i][j]表示点i, j之间的最短距离)则加边(i’, j’’, ∞)。每次根据最大流调整二分的上下界即可。

一种错误的建图方法,即不拆点,见下图:

其中每条无向边表示两条方向相反的有向边,容量均为∞。

当二分到T = 70的时候,显然我们只加入了(2, 3)和(3, 4)两条无向边,因为只有这两对点间的最短距离小于等于70。但是从图中也可以看出,由于没有拆点,点2也可以通过这两条边到达点4,而实际上这是不允许的。也就是说我们所加的限制条件没有起到作用。由此可见,只有拆点才是正确的做法。

《POJ 2699 The Maximum Number of Strong Kings》

【题目大意】

一场联赛可以表示成一个完全图,点表示参赛选手,任意两点u, v之间有且仅有一条有向边(u, v)或(v, u),表示u打败v或v打败u。一个选手的得分等于被他打败的选手总数。一个选手被称为“strong king”当且仅当他打败了所有比他分高的选手。分数最高的选手也是strong king。现在给出某场联赛所有选手的得分序列,由低到高,问合理安排每场比赛的结果后最多能有几个strong king。已知选手总数不超过10个。

【建模方法】

此题乍看之下无从下手,但是注意到strong king只能在分数最高的若干人当中产生,而总人数只有10个,故我们可以枚举strong king的个数C,那么分数最高的C个便是strong king,接下来按下列方法构图:每场比赛i作为一个点(总共tot=n*(n-1)/2个),加边(s, i, 1);每名选手j作为一个点,加边(j, t, score[j]),并再拉出一个点j’,如果j是strong king,则加边(j’, j, score[j]-Max[j])(注意此处score[j] - Max[j] 有可能为负,所以要在构图之前判一下。设当前分数最小的strong king 为mj,若score[mj] < Max[mj]则直接停止枚举,因为mj每场都赢也不够把所有比他分高的选手赢个遍),其中Max[i]表示比选手i分数高的选手总数;否则加边(j’, j, score[j])。对每场比赛i,设参赛的两名选手为Ui, Vi且score[Ui] <= score[Vi],若Ui是strong king且score[Ui] < score[Vi],则加边(i, Ui, 1);否则加边(i, Ui’, 1), (i, Vi’, 1)。当某次最大流小于tot时停止枚举即可。

对每名选手j,所有连到j的边(i, j)表示比赛i必须让j赢。若j是strong king,则(j’, j, score[j]-Max[j])的目的是除去必须让j赢的那Max[j]场以外,剩下的score[j] – Max[j]场可以随意赢剩下的N – Max[j]名选手。对于非strong king的选手也是类似的作用。

这里提一下我的一种错误建模方法:

每名选手i用三个点i’, i’’, i’’’表示,加边(s, i’, score[i]), (i’’’, t, N-1-score[i]),而i’’则充当那个被拉出来的点。其他细节不再提。这样构图之后每一条s-t流表示一场比赛,看似合理但其实是错误的,因为它没有考虑到任何两名选手之间只能进行一场比赛,而这个网络中可能存在两条s-t流,它们关联的是同样的两名选手,只不过胜负对调。故以后在构图时要时刻关注它的严谨性和正确性。

《POJ 3281 Dining》

【题目大意】

有F种食物和D种饮料,每种食物或饮料只能供一头牛享用,且每头牛只享用一种食物和一种饮料。现在有N头牛,每头牛都有自己喜欢的食物种类列表和饮料种类列表,问最多能使几头牛同时享用到自己喜欢的食物和饮料。(1 <= F <= 100, 1 <= D <= 100, 1 <= N <= 100)

【建模方法】

此题的建模方法比较有开创性。以往一般都是左边一个点集表示供应并与源相连,右边一个点集表示需求并与汇相连。现在不同了,供应有两种资源,需求仍只有一个群体,怎么办?其实只要仔细思考一下最大流的建模原理,此题的构图也不是那么难想。最大流的正确性依赖于它的每一条s-t流都与一种实际方案一一对应。那么此题也需要用s-t流将一头牛和它喜欢的食物和饮料“串”起来,而食物和饮料之间没有直接的关系,自然就想到把牛放在中间,两边是食物和饮料,由s, t将它们串起来构成一种分配方案。至此建模的方法也就很明显了:每种食物i作为一个点并连边(s, i, 1),每种饮料j作为一个点并连边(j, t, 1),将每头牛k 拆成两个点k’, k’’并连边(k’, k’’, 1), (i, k’, 1), (k’’, j, 1),其中i, j均是牛k喜欢的食物或饮料。求一次最大流即为结果。

《JOJ 2453 Candy》

【题目大意】

有N颗糖果和M个小孩,老师现在要把这N颗糖分给这M个小孩。每个小孩i 对每颗糖j都有一个偏爱度Aij,如果他喜欢这颗糖,Aij = 2,否则Aij = 1。小孩i 觉得高兴当且仅当∑Cij×Aij >= Bi,j=1,2,…,N,若他分得了糖j,Cij = 1,否则Cij = 0。问能否合理分配这N颗糖,使得每个小孩都觉得高兴。(1 <= N <= 100,000, 1 <= M <= 10, 0 <= Bi <= 1,000,000,000)

【建模方法】

一种最直观的想法就是每颗糖i作为一个点并连边(s, i, ?),每个小孩j作为一个点并连边(j, t, Bj)。若小孩j喜欢糖果i则连边(i, j, 2),否则连边(i, j, 1),然后求一次最大流看是否等于∑Bj。但是问题也很明显,我们还没有给与源点关联的边确定容量。实际上我们无法确定它们的容量,因为最大流无法实现这样一种控制:一个点有若干条出边,容量不尽相同,现在要求经过该点的流可以任选一条出边流走,且一旦选定之后就只能从这条边流而不能再进入其他的出边。因此我们无法确定与源关联的边的容量,因为经过每颗糖i的流无法在出边容量有1又有2的情况下作出正确的选择。

那么是否就没有办法了呢?虽然流无法在容量有1又有2的情况下作出正确的选

择,但却可以在容量有1又有0的情况下最自然地作出正确的选择,流过去就表示选择了那条出边,且因为容量为1,不会再有流进入其他的出边。那么此题的构图方法也就出来了:每颗糖i作为一个点并连边(s, i, 1),每个小孩j作为一个点并连边(j, t, floor(Bj/2)),若小孩j喜欢糖果i则连边(i, j, 1),否则连边(i, j, 0)或者干脆不连边,效果一样。设最大流为ans,若ans+N >= ∑Bj则可以满足要求。为什么?因为每颗糖迟早都要分给某个小孩,它一定会为总权值贡献1,只不过如果它分给了喜欢它的小孩就再额外贡献1。现在我只考虑这额外的1单位贡献究竟能送出去多少,最后加上基值N并与∑Bj比较即可。

《ZOJ 2760 How Many Shortest Path》

【题目大意】

给定一个带权有向图G=(V, E)和源点s、汇点t,问s-t边不相交最短路最多有几条。(1 <= N <= 100)

【建模方法】

分别从源点和汇点作一次Dijkstra,然后为建图方便仍保留所有的点,但只加入满足ds[u]+w[u][v]+dt[v]==dst的边(u, v)(这样便保证网络中的任意一条s-t路都是最短路),容量为1。求一次最大流即为结果。

注意不能按以下方法建图,因为这样会引进一些不在s-t最短路上的边:

保留所有满足ds[u]+dt[u]==dst的点u,在这些点的导出子图中求最大流。

反例:如下图

上述方法会将(1, 3)引入,导致形成错误流1-3-4,而第一种方法则不会。其实只要将第二种方法也加上对边的限制条件而不是将导出子图中的所有边都加上,同样也是正确的。

《WOJ 1124 Football Coach》

【题目大意】

有N支球队,互相之间已经进行了一些比赛,还剩下M场没有比。现在给出各支球队目前的总分以及还剩下哪M场没有比,问能否合理安排这M场比赛的结果,使得第N支球队最后的总分大于其他任何一支球队的总分。已知每场比赛胜者得2分,败者0分,平局则各得1分。(1 <= N <= 100, 0 <= M <= 1000)

【建模方法】

首先,所有跟球队N相关的比赛都要让球队N赢。如果此时仍有某支球队的总分大于等于球队N的总分,则已经不可能满足要求;否则按如下方法建图:每场比赛i(不包括与球队N相关的比赛)作为一个点并加边(s, i, 2),每支球队j (不包括球队N)作为一个点并加边(j, t, score[N]-score[j]-1),每场比赛向与其关联的两支球队u, v连边(i, u, 2), (i, v, 2)。若最大流等于2*比赛场数(不包括与球队N相关的比赛)则可以满足要求。

发散思维:

(1) 如果不允许平局存在,该如何构图?

(s, i, 2) ---> (s, i, 1)

(j, t, score[N]-score[j]-1) ---> (j, t, floor((score[N]-score[j]-1)/2))

(i, u, 2), (i, v, 2) ---> (i, u, 1), (i, v, 1)

《SGU 326 Perspective》

【题目大意】

NBA某小组内有N支球队,小组内以及小组间已经进行了若干场比赛。现在给出这N支球队目前胜利的场数、还剩多少场没有比(包括小组内和小组间)以及小组内任意两支球队之间还剩多少场没有比,问能否合理安排剩下的所有比赛,使得球队1最后胜利的场数至少和小组内任何一支其他球队一样。(2 <= N <= 20, 0 <= x <= 10000, x表示其他任何输入)

【建模方法】

此题和上一题非常相似。同样,所有和球队1相关的比赛全让球队1赢,如果此时仍有某支球队胜利的场数大于球队1,则已经不可能满足要求。按如下方法建图:所有小组内的比赛i(不包括与球队1相关的比赛)作为一个点并加边(s, i, num[i]),每支球队(不包括球队1)作为一个点并加边(j, t, wins[1]-wins[i]),每场比赛向与其关联的两支球队u, v连边(i, u, ∞), (i, v, ∞)。至于其他球队小组间的比赛,直接让他们输掉就好,不用管。若最大流等于∑num[i]则可以满足要求。

《SGU 438 The Glorious Karlutka River =)》

【题目大意】

有一条东西向流淌的河,宽为W,河中有N块石头,每块石头的坐标(Xi, Yi)和最大承受人数Ci已知。现在有M个游客在河的南岸,他们想穿越这条河流,但是每个人每次最远只能跳D米,每跳一次耗时1秒。问他们能否全部穿越这条河流,如果能,最少需要多长时间。(0 <= N <= 50, 0 < M <= 50, 0 <= D <= 1000, 0 < W <= 1000, 0 < Xi < 1000, 0 < Yi < W, 0 <= Ci <= 1000)

【建模方法】

经典的动态流问题,在流量限制的基础上加入了时间限制。首先将南岸作为源点,北岸作为汇点,将每块石头拆成两个点(i’, i’’)并连边(i’, i’’, Ci)。接下来我们再按时间将每块石头拆点,形成一个分层网络time-expanded network,每块石头在不同的时间点都有一个点表示。所有能从南岸跳到的石头,从源点向其各时间点处连边,容量为∞。所有能跳到北岸的石头,从其各时间点处向汇点连边,容量为∞。任意两块距离小于等于D的石头,互相从t到t+1连边,容量为∞。枚举t,并不断地往网络中加点表示当前时刻的石头,直到最大流等于总人数为止,此时的t即为结果。

《SPOJ 287 Smart Network Administrator》

【题目大意】

一座村庄有N户人家。只有第一家可以连上互联网,其他人家要想上网必须拉一根缆线通过若干条街道连到第一家。每一根完整的缆线只能有一种颜色。网管有一个要求,各条街道内不同人家的缆线必须不同色,且总的不同颜色种数最小。求在指定的K户人家都能上网的前提下,最小的不同颜色种数。(1 <= N <= 500)

【建模方法】

此题乍一看不太好考虑,不知道如何去控制同一街道内的缆线颜色各不相同。我们不妨先尝试着建立一个网络模型出来:以第一家作为汇点t,K户人家中的每一户i作为一个点并连边(s, i, 1),对每条街道(u, v),连边(u, v, c), (v, u, c),c=∞。这样求完最大流后每一条s-t流均对应一户人家的缆线,而各条街道内的流量表示有多少户人家的缆线同时穿过该街道,那么这个流量就是只考虑该条街道的时候最少的不同颜色种数。那么答案是否就是所有街道的不同颜色种数的最大值呢?当然不是!最大流只保证总流量最大,而不会去管每条流具体该往哪儿流,所以这么做不一定能得到最优解。我们只要稍微修改这个模型就一定能保证得到最优解:强制c等于某个值limit,再对网络求最大流,如果等于K,说明用c种不同的颜色已经足够了;如果小于K,说明c种还不够,还需要往高了调。同时此处的单调性也很明显:c越高越容易满足要求。思路一下就豁然开朗了:二分c的

值,如果足够了就往下调,否则往上调,直到找到足够和不足够的临界值为止。《SPOJ 962 Intergalactic Map》

【题目大意】

在一个无向图中,一个人要从A点赶往B点,之后再赶往C点,且要求中途不能多次经过同一个点。问是否存在这样的路线。(3 <= N <= 30011, 1 <= M <= 50011)

【建模方法】

由于每个点只能走一次,似乎最短路之类的算法不能用,只有往网络流上靠。将每个点i拆成两个点i’, i’’并加边(i’, i’’, 1)就能轻易达到这个目的。起初我一直以A 为源点思考,却怎么也想不出如何处理先后经过两个汇点的问题,直到灵光一现,想到可以以B为源点,A、C为汇点,看能否增广两次。这个转化看似简单,但却蕴含着一个深刻的道理:条条大路通罗马!正所谓“天涯何处无芳草,何必单恋一枝花”,这样行不通那就换一种方法,说不定一下就妥了!

《小结》

一般来讲,最大流构图最直观最容易理解,但变化也是相当之多,需要多多A 题多多体会。常用的构图方法有以下几种:

(1) 用s-t流表示方案

这是最大流最常用的构图法,每一条s-t流都实实在在地对应着实际问题中的一种操作方案,很好理解。

(2) 待补充。

最小割

《HOJ 2634 How to earn more》

【题目大意】

有M个项目和N个员工。做项目i可以获得Ai元,但是必须雇用若干个指定的员工。雇用员工j需要花费Bj元,且一旦雇用,员工j可以参加多个项目的开发。问经过合理的项目取舍,最多能挣多少钱。(1 <= M, N <= 100)

【建模方法】

注意到题目中加粗的两个字“必须”,此题是典型的“蕴含式最大获利问题”,套用解决最大权闭合子图的建模方法即可解决。每个项目i作为一个点并连边(s, i, Ai),每名员工j作为一个点并连边(j, t, Bj),若项目i需要雇用员工j则连边(i, j, ∞)。设最小割为ans,那么∑Ai-ans即为结果。

发散思维:

(1) 若进一步要求找出做了哪些项目以及雇用了哪些员工,该如何做?

从源点开始作一次DFS并对扫描过的点进行标记,那么被标记的项目和员工即为所求。

(2) 若再进一步要求项目数和员工数的总和最小,该如何做?

待解决。

(3) 如果因做项目i而雇用员工j,则员工j只能参加项目i的开发,若要做另一个需要雇用员工j的项目k,则需要重新付给员工j费用Bj。该如何求解?

由于这样一来各个项目之间在雇用员工的意义上是相互独立的,直接贪心即可。《HOJ 2713 Matrix1》

【题目大意】

一个N*M的网格,每个单元都有一块价值Cij的宝石。问最多能取多少价值的宝石且任意两块宝石不相邻。(1 <= N, M <= 50, 0 <= Cij <= 40000)

【建模方法】

经典的最大点权独立集问题。转化为最小点权覆盖集:先将网格黑白染色,从源点到每个黑点有一条边,从每个白点到汇点有一条边,容量均为相应宝石的价值。每个黑点向与其相邻的四个白点连边,容量为∞。设最小割为ans,结果即为∑Cij – ans。

《POJ 1815 Friendship》

【题目大意】

现代社会人们都靠电话通信。A与B能通信当且仅当A知道B的电话号或者A 知道C的电话号且C与B能通信。若A知道B的电话号,那么B也知道A的电话号。然而不好的事情总是会发生在某些人身上,比如他的电话本丢了,同时他又换了电话号,导致他跟所有人失去了联系。现在给定N个人之间的通信关系以及特定的两个人S和T,问最少几个人发生不好的事情可以导致S与T无法通信并输出这些人。如果存在多组解,输出字典序最小的一组。(2 <= N <= 200)

【建模方法】

此题是求一个最小点割集,但是要求输出方案且要字典序最小。首先仍是拆点构图,求一次最小割记为ans。之后我们采取贪心的策略,从1至N枚举删点,如果最小割不变,说明该点不可能在最小割中,我们再把该点加入到网络中;否则最小割一定变小了,用这个较小值更新ans,记录该点是一个解并不再将其放回。重复这个过程,把所有点都扫描一遍后结果就出来了。

《ZOJ 2532 Internship》

【题目大意】

有N个城市,M个中转站以及L条有向边(u, v, c),表示可以从u向v传送信息,带宽为c。每个城市都在向CIA总部发送无穷大的信息量,但是目前总部实际接收带宽已经不能满足要求。CIA决定要增大某条边的带宽以增大总部的接收带宽,请找出哪些边带宽的增加能导致总部接收带宽的增加。(1 <= N+M <= 100, 1 <= L <= 1000)

【建模方法】

此题要求找出这样一条边,增加它的容量可以导致最大流的增加。最直观的做法是先求一次最大流记为ans,然后枚举每条边的容量加1再求最大流,看是否大于ans。但是这样做复杂度太高。有没有更好的办法?如果我们换个角度,考虑求完最大流后残量网络R中的割,那么问题便迎刃而解。最大流的含义是我们现在在R中找不到一条从s走到t的增广路。我们只要找到这样的割边(u, v),使得R中从s能走到u,从v能走到t,那么当我增加这条割边的容量后,它就会再次出现在R中,架起一条增广路s-u-v-t,从而增加最大流的流量。再正式描述一下算法流程:求一次最大流,然后在残量网络R中以正向弧对s、以正向弧的逆对t作DFS,并用from[i], to[i]标记点i能否从s可达,能否可达t。扫描每一条正向弧(u, v),若它残留容量为0且from[u]且to[v],则(u, v)为一个解。

发散思维:

(1) 如何判定网络的最小割是否唯一?

同样求一次最大流后在残量网络R中以正向弧对s、以正向弧的逆对t作DFS,只不过这次只用一个flag[i]标记点i是否在两次DFS中被探访过。最后扫一遍所有点,如果存在没有被探访过的,则说明最小割不唯一。

《Ural 1277 Cops and Thieves》

【题目大意】

一个犯罪团伙打算去偷一家美术馆。警察决定派K个人堵住所有从匪窝通向美术馆的道路,不过他们只能驻守在沿途顶点处而不能在匪窝或美术馆,且每个点都有一个需要警察驻守的最低人数Ri。问警察能否完成任务。(2 < N <= 100, 1 < M <= 10000)

【建模方法】

此题是无向图点带权的点连通度问题。将每个点i拆成两个点i’, i’’,除匪窝s和美术馆t外加边(i’, i’’, Ri),将每条无向边(i, j)分解为(i’’, j’), (j’’, i’)。令s’’为源,t’为汇,求一次最小割即为结果。(注意此题还需要特判匪窝和美术馆在同一点的情况)

发散思维:

(1) 如果警察只能驻守在边上,该如何做?

直接以原图为网络求最小割即可。

(3) 如何求无向图的边连通度?

任选一点固定为源,枚举汇点求最小割,取最小值即为所求。

(3) 如何求无向图的点连通度?

令本题中的Ri = 1,以度最小的顶点为源,枚举汇点求最小割,取一个最小值即为所求。

《SPOJ 839 Optimal Marks》

【题目大意】

给出一个无向图,每个点有一个标号mark[i],不同点可能有相同的标号。对于一条边(u, v),它的权值定义为mark[u] xor mark[v]。现在一些点的标号已定,请决定剩下点的标号,使得总的边权和最小。(0 < N <= 500, 0 <= M <= 3000, 0 <= mark[i] <= 2^31-1)

【建模方法】

先规范化问题,不妨设所有点一定和已知标号的点连通。否则,令那些不与已知

标号点连通的点的标号为0,这些点间的边权也不必计入目标函数(边权都为0)。在问题的优化式子中,发现异或操作不好处理,难以转化为一些基本运算。深入

分析异或操作的本质我们会发现,各个二进制位间是互不影响的。所以我们可以

分别处理各个二进制位,最后再汇总即可。处理每个二进制位时构图如下:保留

原始标号,将每个点的最优标号置0;对每个已经有原始标号的点i,若i的该位

是1则连边(s, i, ∞),否则连边(i, t, ∞);对原图中的每条边(i, j),连边(i, j, 1), (j, i, 1)。求一次最小割后,对源点DFS,所有被探访到的点,将其最优标号中的该位

置1即可。

《SPOJ 1693 Coconuts》

【题目大意】

N个城堡守卫正在就非洲的燕子能否搬运椰子而进行投票(他们怎么这么无聊-_-b)。每个人都有自己的看法,但是为了避免跟自己的朋友持相反意见,他们

时常会投相反的票。现在给出每个人的初始看法以及朋友关系,求在某种投票方

案下,违背自己意愿的票数与持不同意见的朋友对数的总和最小。(2 <= N <= 300, 1 <= M <= N(N-1)/2)

【建模方法】

此题是经典的“二者取其一式问题”。每名守卫i作为一个点,若他投赞成票,

则加边(s, i, 1), (i, t, 0),否则加边(s, i, 0), (i, t, 1)(设最小割中与源s连通的点表示

赞同);若i跟j是朋友,则加边(i, j, 1), (j, i, 1)。求一次最小割即为结果。

发散思维:

(1) 如何求这个函数的最小值?

E(x1, x2, …, xn) = ∑(1-xi)*|pi-v0| + ∑xi*|pi-v1| + ∑|xi-xj|*|pi-pj|, pi, v0, v1均为

常数,xi∈{0, 1}

且不管这个函数表达什么意思,光是分析它的结构我们就能发现这是一个“二者

取其一式问题”:把前两项合起来考虑就会发现,要么xi=0并获得一个|pi-v0|,

要么xi=1并获得一个|pi-v1|;考虑第三项,如果xi, xj取不同值时获得一个|pi-pj|。与这个模型惊人的相似!构图思路和之前一模一样,求一次最小割即为结果。

《Beijing Regional 2008 Problem A Destroying the bus stations》

【题目大意】

给定一个无权有向图G=(V, E)和源点s、汇点t,问最少去掉几个点(连同与其关

联的所有边)使得不存在长度小于等于K的s-t路。(0 < N <= 50, 0 < M <= 4000, 0 < K < 1000)

【建模方法】

此题与《ZOJ 2760 How Many Shortest Path》非常相似,区别在于边不带权且求的是最小点割。同样,分别从源点和汇点作一次BFS,为了阻断所有长度小于等于K的s-t路,我们必须将所有满足ds[u]+dt[u]<=K的点都考虑在内而不用去管ds[u]+dt[u]>K的点,因为只要某一条s-t路经过了该点,它的长度就一定大于K,不删这个点这条路照样满足要求。那么建模的方法也就呼之欲出了:在网络中加入满足ds[u]+dt[u]<=K的点u,将其拆成两个点(u’, u’’),加边(u’, u’’, 1)。若原图中有边(u, v)且u, v均在网络中,则加边(u’’, v’, ∞)。求一次最小割即为结果。

《小结》

最小割是最大流的对偶问题,但在实际建模过程中,它不如最大流来的直观,模型也往往隐蔽得很深,不容易找到构图方法。通过做大量的题,我总结出以下几种构图方法:

(1) 用s-t割集表示方案

这是最小割最基本的构图法,每一个s-t割集都实实在在地对应着实际问题中的一种操作方案,比其他应用好理解。

(2) 蕴含式最大获利问题

个人认为这是最小割最NB的应用。这类建模方法有一个明显的特点,就是所谓的“蕴含式A --> B”,表示“要做A必须也得做B”。就是这么一个简单的蕴含关系,造就了最小割这个NB的应用。

(3) 二者取其一式问题

个人认为这是最小割次NB的应用。这类建模方法也有一个明显的特点,就是每个点都可以有两种方案供选择,每种方案都有一个花费,必须且只能选择其中一种;另外如果某两个点选择了不同的方案,还要在这两个点之间增加额外的费用。这种应用其实也可算作第一种构图法,只不过它的特点更明显,所以我把它单列出来。

(4) 待补充。

网络流算法

网络流算法 在实际生活中有许多流量问题,例如在交通运输网络中的人流、车流、货物流,供水网络中的水流,金融系统中的现金流,通讯系统中的信息流,等等。50年代以福特(Ford)、富克逊(Fulkerson)为代表建立的“网络流理论”,是网络应用的重要组成部分。在最近的奥林匹克信息学竞赛中,利用网络流算法高效地解决问题已不是什么稀罕的事了。本节着重介绍最大流(包括最小费用)算法,并通过实际例子,讨论如何在问题的原型上建立—个网络流模型,然后用最大流算法高效地解决问题。 [问题描述]如图4-1所示是联结某产品地v1和销售地v4的交通网,每一弧(vi,vj)代表从vi到vj的运输线,产品经这条弧由vi输送到vj,弧旁的数表示这条运输线的最大通过能力。产品经过交通网从v1到v4。现在要求制定一个运输方案使从v1到v4的产品数量最多。 一、基本概念及相关定理 1)网络与网络流 定义1 给一个有向图N=(V,E),在V中指定一点,称为源点(记为vs,和另一点,称为汇点(记为vt),其余的点叫中间点, 对于E中每条弧(vi,vj)都对应一个正整数c(vi,vj)≥O(或简写成cij),称为f的容量,则赋权有向图N=(V,E,c,vs,vt)称为一个网络。如图4-1所给出的一个赋权有向图N就是一个网络,指定v1是源点,v4为汇点,弧旁的数字为cij。 所谓网络上的流,是指定义在弧集合E上一个函数f={f(vi,vj)},并称f(vi,vj)为弧(vi,vj)上的流量(下面简记为fij)。如图4-2所示的网络N,弧上两个数,第一个数表示容量cij,第二个数表示流量fij。 2)可行流与最大流 在运输网络的实际问题中,我们可以看出,对于流有两个显然的要求:一是每个弧上的流量不能超过该弧的最大通过能力(即弧的容量);二是中间点的流量为0,源点的净流出量和汇点的净流入量必相等且为这个方案的总输送量。因此有: 定义2 满足下列条件 (1)容量约束:0≤fij≤cij,(vi,vj)∈E, (2)守恒条件 对于中间点:流入量=流出量;对于源点与汇点:源点的净流出量vs(f)=汇点的净流入量(-vt(f))的流f,称为网络N上的可行流,并将源点s的净流量称为流f的流值v(f)。 网络N中流值最大的流f*称为N的最大流。 3)可增广路径 所谓可增广路径,是指这条路径上的流可以修改,通过修改,使得整个网络的流值增大。 定义3 设f是一个可行流,P是从源点s到汇点t的一条路,若p满足下列条件:

网络最大流问题概论

给定一个有向图D=(V,A),在V中指定一点称为发点(记为),该点只有出发去的弧,指定另一点称为收点(记为),该点只有指向它的弧,其余的点叫做中间点。对于A中的每一条弧,对应一个数(简记),称之为弧的容量。通常我们把这样的D叫做网络,记为D=(V,A,C)。 (2)网络流:在弧集A上定义一个非负函数。是通过弧的实际流量,简记,称是网络上的流函数,简称网络流或流,称为网络流的流量。 §4 网络最大流问题 网络最大流问题是网络的另一个基本问题。 许多系统包含了流量问题。例如交通系统有车流量,金融系统有现金流,控制系统有信息流等。许多流问题主要是确定这类系统网络所能承受的最大流量以及如何达到这个最大流量。 4.1 基本概念与定理 1.1.网络与流 定义14 (1)网络: 例1如图7-20是连结某产品产地和销地的交通图。弧表示从 到的运输线,弧旁的数字表示这条运输线的最大通过能力,括号内的数字表示该弧上的实际流。现要求制定一个运输方案,使从运到的产品数量最多。 可行流与最大流

在运输网络的实际问题中,我们可以看出,对于流有两个基本要求: 一是每条弧上的流量必须是非负的且不能超过该弧的最大通过能力(即该弧的容量); 二是起点发出的流的总和(称为流量),必须等于终点接收的流的总和,且各中间点流入的流量之和必须等于从该点流出的流量之和,即流入的流量之和与流出的流量之和的差为零,也就是说各中间点只起转运作用,它既不产出新的物资,也不得截留过境的物资。 因此有下面所谓的可行流的定义。 定义14对于给定的网络D=(V,A,C)和给定的流,若满足下列条件: (1)容量限制条件:对每一条弧,有 (7.9) (2)平衡条件: 对于中间点: 流出量=流入量,即对于每一个i (i≠s,t),有 (7.10) 对于出发带点,有 (7.11) 对于收点,有 (7.12) 则称为一个可行流,称为这个可行流的流量。 注意,我们这里所说的出发点是指只有从发出去的弧,而没有指向的弧; 收点是指只有弧指向,而没有从它的发出去的弧。

网络最大流问题

给定一个有向图D=(V,A),在V中指定一点称为发点(记为),该点只有出发去的弧,指定另一点称为收点(记为),该点只有指向它的弧,其余的点叫做中间点。对于A中的每一条弧,对应一个数(简记),称之为弧的容量。通常我们把这样的D叫做网络,记为D=(V,A,C)。 (2)网络流:在弧集A上定义一个非负函数。就是通过弧 的实际流量,简记,称就是网络上的流函数,简称网络流或流,称为网络流的流量。 §4 网络最大流问题 网络最大流问题就是网络的另一个基本问题。 许多系统包含了流量问题。例如交通系统有车流量,金融系统有现金流,控制系统有信息流等。许多流问题主要就是确定这类系统网络所能承受的最大流量以及如何达到这个最大流量。 4、1 基本概念与定理 1.1.网络与流 定义14 (1)网络: 例1如图7-20就是连结某产品产地与销地的交通图。弧表示从 到的运输线,弧旁的数字表示这条运输线的最大通过能力,括号内的数字表示该弧上的实际流。现要求制定一个运输方案,使从运到的产品数量最多。 可行流与最大流 在运输网络的实际问题中,我们可以瞧出,对于流有两个基本要求:

一就是每条弧上的流量必须就是非负的且不能超过该弧的最大通过能力(即该弧的容量); 二就是起点发出的流的总与(称为流量),必须等于终点接收的流的总与,且各中间点流入的流量之与必须等于从该点流出的流量之与,即流入的流量之与与流出的流量之与的差为零,也就就是说各中间点只起转运作用,它既不产出新的物资,也不得截留过境的物资。 因此有下面所谓的可行流的定义。 定义14对于给定的网络D=(V,A,C)与给定的流,若满足下列条件: (1)容量限制条件:对每一条弧,有 (7、9) (2)平衡条件: 对于中间点: 流出量=流入量,即对于每一个i (i≠s,t),有 (7、10) 对于出发带点,有 (7、11) 对于收点,有 (7、12) 则称为一个可行流,称为这个可行流的流量。 注意,我们这里所说的出发点就是指只有从发出去的弧,而没有指向的弧;收点就是指只有弧指向,而没有从它的发出去的弧。 可行流总就是存在的。例如令所有弧上的流,就得到一个可行流,(称为零流),其流量。 如图7-20中,每条弧上括号内的数字给出的就就是一个可行流,它显然满足定义中的条件(1)与(2)。其流量。 所谓网络最大流问题就就是求一个流,使得总流量达到最大,并且满足定义15中的条件(1)与(2),即 max

从一道题目的解法试谈网络流的构造与算法Word版

从一道题目的解法试谈网络流的构造与算法 福建师大附中江鹏 1. 引论 A. 对网络流算法的认识 网络流算法是一种高效实用的算法,相对于其它图论算法来说,模型更加复杂,编程复杂度也更高,但是它综合了图论中的其它一些算法(如最短路径),因而适用范围也更广,经常能够很好地解决一些搜索与动态规划无法解决的,看似NP的问题。 B. 具体问题的应用 网络流在具体问题中的应用,最具挑战性的部分是模型的构造。这没用现成的模式可以套用,需要对各种网络流的性质了如指掌(比如点有容量、容量有上下限、多重边等等),并且归纳总结一些经验,发挥我们的创造性。

2. 例题分析 【问题1】项目发展规划(Develop) Macrosoft?公司准备制定一份未来的发展规划。公司各部门提出的发展项目汇总成了一张规划表,该表包含了许多项目。对于每个项目,规划表中都给出了它所需的投资或预计的盈利。由于某些项目的实施必须依赖于其它项目的开发成果,所以如果要实施这个项目的话,它所依赖的项目也是必不可少的。现在请你担任Macrosoft?公司的总裁,从这些项目中挑选出一部分,使你的公司获得最大的净利润。 ●输入 输入文件包括项目的数量N,每个项目的预算Ci和它所依赖的项目集合Pi。格式如下:第1行是N; 接下来的第i行每行表示第i个项目的信息。每行的第一个数是Ci,正数表示盈利,负数表示投资。剩下的数是项目i所依赖的项目的编号。 每行相邻的两个数之间用一个或多个空格隔开。 ●输出 第1行是公司的最大净利润。接着是获得最大净利润的项目选择方案。若有多个方案,则输出挑选项目最少的一个方案。每行一个数,表示选择的项目的编号,所有项目按从小到大的顺序输出。 ●数据限制 0≤N≤1000 -1000000≤Ci≤1000000 ●输入输出范例

网络流模型总结

网络流模型总结 福州一中肖汉骏【引言】: “许多问题可以先转化为网络流问题,再运用最大流算法加以解决。而发现问题本质,根据最大流算法的特点,设计与之相配的数学模型是运用最大流算法解决问题的重要步骤。” “网络流在具体问题中的应用,最具挑战性的部分是模型的构造。这没用现成的模式可以套用,需要对各种网络流的性质了如指掌(比如点有容量、容量有上下限、多重边等等),并且归纳总结一些经验,发挥我们的创造性。” 注:本文大部分出自江涛老师讲稿及网络资料

图1.1 【理论部分】: 一、引入 如同我们可以把一个实际的道路地图抽象成一个有向图来计算两点之间的最短路径,我们也可以将一个有向图看作一个流网络来解决另一类型的问题。流网络比较适合用来模拟液体流经管道、电流在电路网络中的运动、信息网络中信息的传递等等类似的过程。 一个实例:运输网络 参看下图,给定一个有向图G=(V ,E),把图中的边看作管道,每条边上有一个权值,表示该管道的流量上限。给定源点s 和汇点t ,现在假设在s 处有一个水源,t 处有一个蓄水池,问从s 到t 的最大水流量是多少,类似于这类的问题都可归结为网络流问题。 在流网络中,每条有向边可以被看导管。每根导管有一个固定的容量,代表物质流经这个导管的最大速率,例如一个管道每小时最多能流过200加仑液体或者一根电线最多能承载20安培的电流。流网络中的顶点可以看作是导管的连接处。除了源点和汇点之外,物质流进每个点的速率必须等于流出这个点的速率。如果我们把研究的物质特化为电流,这种“流的保持”属性就好像电路中的基尔霍夫电流定律一样。

二、网络流相关定义1 网络定义: 一个有向图 G=(V ,E); 有两个特别的点:源点s 、汇点t ; 图中每条边(u,v)∈E ,有一个非负值的容量C(u,v) 记为 G=(V ,E ,C),网络三要素:点、边、容量 可行流定义: 是网络G 上的一个“流”,即每条边上有个“流量”P(u,v),要满足下面两个条件: 流的容量限制——弧: ),(),(0v u C v u P ≤≤ 对任意弧(u,v)---有向边 流的平衡限制——点: 除源点和汇点,对任意中间点有:流入u 的“流量”与流出u 的“流量”相等。即: {,}(,)(,)0x V x V u V s t P x u P u x ∈∈?∈--=∑∑有 网络的割: 一个s-t 割是这样一个边的集合,把这些边从网络中删除之后,s 到t 就不可达了。或者,正式的说,一个割把顶点集合分成A,B 两个集合,其中s 在A 中,t 在B 中,而割中的边就是所有从A 出发,到达B 的所有边。 割的容量就是割中所有边的容量的和。正式的说,就是所有从A 到B 的边的容量的和。 网络的流量: 源点的净流出“流量” 或 汇点的净流入“流量”。即: ∑∑∑∑∈∈∈∈-=-V x V x V x V x x t P t x P s x P x s P ),(),(),(),( 注意,我们这里说的流量是一种速率,而不是指总量。联系上面所说的实例,下面是一个流量为1的可行流:

图与网络模型_最大流问题

最大流问题 在许多实际的网络系统中都存在着流量和最大流问题。例如铁路运输系统中的车辆流,城市给排水系统的水流问题等等。 网络系统流最大流问题是图与网络流理论中十分重要的最优化问题,它对于解决生产实际问题起着十分重要的作用。 基本概念 设一个赋权有向图D=(V , A),在V 中指定一个发点(源)vs 和一个收点(汇)vt ,且只能有一个发点vs 和一个收点vt 。(即D 中与vs 相关联的弧只能以 vs 为起点,与vt 相关联的弧只能以 vt 为终点),其他的点叫做中间点。 对于D 中的每一个弧(vi, vj)A ∈,都有一个权cij 叫做弧的容量。我们把这样的图 D 叫做一个网络系统,简称网络,记做D =(V , A, C) 。 Vs Vt 图1 图1是一个网络。每一个弧旁边的权就是对应的容量。 网络D 上的流,是指定义在弧集合A 上的一个函数f={f(vi, vj)}={fij},f(vi,vj)=fij 叫做弧在(vi,vj)上的流量 。 Vs Vt 图2 图2中,每条弧上都有流量fij ,例如fs1=5,fs2=3,f13=2等。 容量是最大通过能力,流量是单位时间的实际通过量。显然,0≤fij≤cij 。网络系统上流的特点: (1)发点的总流出量和收点的总流入量必相等; (2)每一个中间点的流入量与流出量的代数和等于零; (3)每一个弧上的流量不能超过它的最大通过能力(即容量)。网络上的一个流f={fij}叫做可行流,如果f 满足以下条件: (1)容量条件:对于每一个弧(vi,vj)A ∈,有0≤fij≤cij 。

(2)平衡条件: 对于发点vs ,有∑f sj ?∑f js =v (f ) 对于收点vt ,有∑f tj ?∑f jt =?v (f ) 对于中间点,有∑f ij ?∑f ji =0 其中发点的总流量(或收点的总流量)v(f)叫做这个可行流的流量。 网络系统中最大流问题就是,在给定的网络上寻求一个可行流f={fij},其流量v(f)达到最大值,即从vs 到vt 的通过量最大。 最大流问题可以通过线性规划数学模型来求解。图1的最大流问题的线性规划数学模型为 max v =f s 1+f s 2 s.t. { ∑j f ij ?∑i f ij =0 i ≠s,t 0≤f ij ≤c ij 所有弧(v i ,v j ) fs1和fs2是与起点相连的两条弧上的流量。 满足上式的约束条件的解{fij}称为可行解,在最大流问题中称为可行流。 对有多个发点和多个收点的网络,可以另外虚设一个总发点和一个总收点,并将其分别 与各发点、收点连起来,就可以转换为只含一个发点和一个收点的网络。 S T 所以一般只研究具有一个发点和一个收点的网络。 我们把fij=cij 的弧叫做饱和弧,fij0的弧为非零流弧,fij=0的弧叫做零流弧。 在图3(图1与2合并图)中,(v4,v3)是饱和弧,其他的弧是非饱和弧,并且都是非零 流弧。 Vs Vt ,fij )图3 网络D 中,从发点νs 和收点vt 的一条路线称为链(记为μ)。从发点νs 到收点vt 的方向规定为链的方向。

网络流题目集锦

(2010-02-07 18:00:40) 转载 分类:ACM 标签: 杂谈 最大流 POJ 1273 Drainage Ditches POJ 1274 The Perfect Stall (二分图匹配) POJ 1698 Alice's Chance POJ 1459 Power Network POJ 2112 Optimal Milking (二分) POJ 2455 Secret Milking Machine (二分) POJ 3189 Steady Cow Assignment (枚举) POJ 1637 Sightseeing tour (混合图欧拉回路) POJ 3498 March of the Penguins (枚举汇点) POJ 1087 A Plug for UNIX POJ 1149 Pigs (构图题) ZOJ 2760 How Many Shortest Path (边不相交最短路的条数) POJ 2391 Ombrophobic Bovines (必须拆点,否则有BUG) WHU 1124 Football Coach (构图题) SGU 326 Perspective (构图题,类似于 WHU 1124) UVa 563 Crimewave UVa 820 Internet Bandwidth POJ 3281 Dining (构图题) POJ 3436 ACM Computer Factory POJ 2289 Jamie's Contact Groups (二分) SGU 438 The Glorious Karlutka River =) (按时间拆点) SGU 242 Student's Morning (输出一组解) SGU 185 Two shortest (Dijkstra 预处理,两次增广,必须用邻接阵实现,否则 MLE) HOJ 2816 Power Line POJ 2699 The Maximum Number of Strong Kings (枚举+构图)

网络流算法讲座材料

网络流常用算法: 1.Fort_Fulkerson算法. 2.Edmonds_Karp算法(最短增广路算法).-------------------O( n*m^2 ) 3.SAP算法(使用距离标号的最短增广路算法).--------------O( n^2*m ) 4.Dinic算法.------------------------------------------O( n^2*m ) 5.Push_Relabel算法(预流推进算法).---------------------O( n^2*m ) 6.FIFO Preflow_Push算法.-------------------------------O( n^2*m) 7.Relabel_to_Front算法.--------------------------------O( n^3 ) 8.Highest Label Preflow_push算法.----------------------O( n^2*m^1/2) 网络流算法讲座材料 1 概念与性质 网络N是指具有以下结构的有向图D,D中有两个称为源和汇的不同顶点s, t,在D的弧集E上定义了非负整数值函数c。 网络N的流是定义在弧集E上的整数值函数,满足对任意边a, 0<=f(a)<=c(a),且对任意顶点,入流量等于出流量。 性质1:任何st-流都具有如下性质:从s的出流量等于到t的入流量。 性质2:任何st-流都有一个最大流,它可以表示为从s到t,至多E条有向路径集合上的流。 图的切割是将顶点分成两个独立的集合,交叉边是一条连通两个集合中顶点的边,交叉边的集合叫做切割集合。 网络N的st-切割是这样的一个切割,它将源s放到一个集合,将汇t放到另一个集合。与st-切割对应的每条交叉边或者是st-边(从集合s指向集合t),或者是ts-边(从集合t指向集合s),st-切割的容量是st-边的容量之和,st-切割的流量等于st-边上的流量和与ts-边上的流量和之差。 性质3:网络中所有st-流的最大值等于所有st-切割的最小容量。 残余网络 边费用是定义在边集E上的整数值函数h。流的费用是该流的所有边的流值与边费用乘积的总和。 最小费用最大流是费用最小的最大流。 性质4:当且仅当残余网络不包含负开销的有向环时,最大流才是一个最小费用流。 2 最大流应用 2.1 一般网络的最大流 描述:给定一个含多个源和多个汇的网络,找出其中的最大流。 解法:在原网络的基础上,增加一个虚源s和一个虚汇t。若原网络有p个源s1, s2, …, sp和q个汇t1, t2, …, tq,则在原网络中增加p条以s为起

网络最大流问题算法研究【开题报告】

开题报告 数学与应用数学 网络最大流问题算法研究 一、综述本课题国内外研究动态, 说明选题的依据和意义 最大流问题是指在一定的条件下, 要求流过网络的物流、能量流、信息流等流量为最大的问题[2]. 最大流问题已有50多年的研究历史, 这段时期内, 人们建立了最大流问题较 为完善的理论, 同时开发了大量优秀的算法. 如Ford 和Fulkerson 增截轨算法 [3]、Dinic 阻塞流算法、Goldberg 推进和重标号算法[6]以及Goldberg 和Rao 的二分长度阻塞流算法等等, 这些经典算法及相关技术对网络最大流问题的研究起到了非常重要的推动作用. 近年来, 随着计算机科学技术和网络的快速发展, 网络最大流问题得到了更深入的研究, 并极大地推动了最大流问题的研究进展. 然而, 研究工作仍未结束: 首先, 在理论算法研究方面, 人们还没有发现最大流问题算法时间复杂度的精确下界, 更没有任何一个通用算法达到或接近问题的下界; 其次, 在算法的实际性能方面, 目前算法的实际性能也不能满足许多应用问题的要求; 同时,最大流问题作为特殊的线性规划问题, 它远比一般线性规划问题容易解决, 发现应用领域中的问题和最大流问题的联系可以使应用问题更好地得到解决. 因此, 关于网络最大流问题的研究具有十分重要的理论意义和实用价值[5]. 最早的算法是Dantzig 提出的网络单纯刑法和Ford 和Fulkerson 的增载轨算法, 他们都是伪多项式时间算法, 分别由Dinic, Edmonds 和Karp 等提出. 1973年Dinic 首次获得了时间复杂度的核心因子为nm 算法. 以后的几十年中, 最大流算法获得了很大的进展. 在最大流问题中, ()nm O 时间界是一个自然的障碍. 如果我们把一个流沿从源到汇的各个路径进行分解, 根据流分解定理, 这些包含流的路径的总长度为()nm Θ.因此, 对每次利用一条曾接轨的算法, ()nm O 时间是这类算法的下界. 尽管这个下界对使用动态树数据结构或基于预流概念的算法是不适用的, 但在很长一段时间内, ()nm O 的

浅谈网络流算法与几种模型转换

浅谈网络流算法与几种流模型 吴迪1314010425 摘要:最大流的算法,算法思想很简单,从零流开始不断增加流量,保持每次增加流量后都满足容量限制、斜对称性和流量平衡3个条件。只要残量网络中不存在增广路,流量就可以增大,可以证明他的逆命题也成立;如果残量网络中不存在增广路,则当前流就是最大流。这就是著名的增广路定理。s-t的最大流等于s-t的最小割,最大流最小割定理。网络流在计算机程序设计上有着重要的地位。 关键词:网络流Edmonds-Karp 最大流 dinic 最大流最小割网络流模型最小费用最大流 正文: 图论中的一种理论与方法,研究网络上的一类最优化问题。1955年,T.E.哈里斯在研究铁路最大通量时首先提出在一个给定的网络上寻求两点间最大运输量的问题。1956年,L.R. 福特和 D.R. 富尔克森等人给出了解决这类问题的算法,从而建立了网络流理论。所谓网络或容量网络指的是一个连通的赋权有向图 D= (V、E、C),其中V 是该图的顶点集,E是有向边(即弧)集,C是弧上的容量。此外顶点集中包括一个起点和一个终点。网络上的流就是由起点流向终点的可行流,这是定义在网络上的非负函数,它一方面受到容量的限制,另一方面除去起点和终点以外,在所有中途点要求保持流入量和流出量是平衡的。如果把下图看作一个公路网,顶点v1…v6表示6座城镇,每条边上的权数表示两城镇间的公路长度。现在要问:若从起点v1将物资运送到终点v6去,应选择那条路线才能使总运输距离最短?这样一类问题称为最短路问题。如果把上图看作一个输油管道网,v1 表示发送点,v6表示接收点,其他点表示中转站,各边的权数表示该段管道的最大输送量。现在要问怎样安排输油线路才能使从v1到v6的总运输量为最大。这样的问题称为最大流问题。 最大流理论是由福特和富尔克森于 1956 年创立的,他们指出最大流的流值等于最小割(截集)的容量这个重要的事实,并根据这一原理设计了用标号法求最大流的方法,后来又有人加以改进,使得求解最大流的方法更加丰富和完善。最大流问题的研究密切了图论和运筹学,特别是与线性规划的联系,开辟了图论应用的新途径。 先来看一个实例。 现在想将一些物资从S运抵T,必须经过一些中转站。连接中转站的是公路,每条公路都有最大运载量。如下: 每条弧代表一条公路,弧上的数表示该公路的最大运载量。最多能将多少货物从S运抵T? 这是一个典型的网络流模型。为了解答此题,我们先了解网络流的有关定义和概念。 若有向图G=(V,E)满足下列条件: 1、有且仅有一个顶点S,它的入度为零,即d-(S) = 0,这个顶点S便称为源点,或称为发点。 2、有且仅有一个顶点T,它的出度为零,即d+(T) = 0,这个顶点T便称为汇点,或称为收点。 3、每一条弧都有非负数,叫做该边的容量。边(vi, vj)的容量用cij表示。 则称之为网络流图,记为G = (V, E, C) 介绍完最大流问题后,下面介绍求解最大流的算法,算法思想很简单,从零流开始不断增加流量,保持每次增加流量后都满足容量限制、斜对称性和流量平衡3个条件。 三个基本的性质: 如果C代表每条边的容量F代表每条边的流量 一个显然的实事是F小于等于C 不然水管子就爆了 这就是网络流的第一条性质容量限制(Ca pacity Constraints):F ≤ C 再考虑节点任意一个节点流入量总是等于流出的量否则就会蓄水或者平白无故多出水 这是第二条性质流量守恒(Flow Conservation):Σ F = Σ F 当然源和汇不用满足流量守恒 最后一个不是很显然的性质是斜对称性(Skew Symmetry): F = - F 这其实是完善的网络流理论不可缺少的就好比中学物理里用正负数来定义一维的位移一样 百米起点到百米终点的位移是100m的话那么终点到起点的位移就是-100m同样的x向y流了F 的流y就向x流了-F的流 把图中的每条边上的容量于流量之差计算出,得到参量网络。 我们的算法基于这样一个事实:参量网络中任

网络最大流问题算法研究【文献综述】

文献综述 数学与应用数学 网络最大流问题算法研究 最大流问题是指在一定的条件下,要求流过网络的物流、能量流、信息流等流量为最大的问题[2].最大流问题已有50多年的研究历史,这段时期内,人们建立了最大流问题较为完善的理论,同时开发了大量的算法.如Ford和Fulkerson增截轨算法、Dinic阻塞流算法、Goldberg推进和重标号算法[6]以及Goldberg和Rao的二分长度阻塞流算法等等,这些经典算法及相关技术对网络最大流问题的研究起到了非常重要的推动作用.近年来,随着计算机科学技术和网络的快速发展,网络最大流问题得到了更深入的研究,并极大地推动了最大流问题的研究进展.然而,研究工作仍未结束:首先,在理论算法研究方面,人们还没有发现最大流问题算法时间复杂度的精确下界,更没有任何一个通用算法达到或接近问题的下界; 其次,在算法的实际性能方面,目前算法的实际性能也不能满足许多应用问题的要求; 同时,最大流问题作为特殊的线性规划问题, 它远比一般线性规划问题容易解决,发现应用领域中的问题和最大流问题的联系可以使应用问题更好地得到解决.因此,关于网络最大流问题的研究具有十分重要的理论意义和实用价值[5]. 最早的算法是Dantzig[6]提出的网络单纯刑法和Ford和Fulkerson的增载轨算法, 他们都是伪多项式时间算法,分别由Dinic、Edmonds和Karp等提出.1973年Dinic首 次获得了时间复杂度的核心因子为nm算法.以后的几十年中,最大流算法获得了很 大的进展. 本文主要介绍的是网络最大流的几种主要算法,其中重点介绍了标号算法的详细 过程,其后给出了其在实际中的应用实例,后面介绍了现有的几种主要算法,虽然没 有给出具体的程序,但本文目的主要是了解最大流问题的解决思想,读者对网络流算 法有更深刻的认识,读者要想了解更多关于最大流问题的研究,详细可以参照Goldberg等人的研究成果, 这些程序在网上都可以轻松得到. 在这里就不再详细讲述. 下面简要介绍一下增载轨算法. 增载轨算法[5]: 沿剩余网络中从源到汇的有向路径推进流. 增载轨算法包括Ford

网络流构图总结

网络流专题研究 福州一中肖汉骏 预备知识(参见Amber论文) 网络和流 残留网络和增广路径 最大流和最小割 主要算法 最大流 增广路方法Ford-Fulkerson method 一般增广路算法Labeling algorithm 连续增广路算法 由陈启峰提出,竞赛中相当实用,近于O(m) 容量缩放增广路算法Capacity scaling algorithm 最短增广路算法Edmonds-Karp algorithm 连续最短增广路算法Successive shortest augmenting path algorithm (Dinic augorithm) 预流推进方法Preflow-push method 一般预流推进算法Generic preflow-push algorithm 先进先出预流推进算法FIFO preflow-push algorithm 最高标号预流推进算法Highest-label preflow-push algorithm (Relabel-to-Front algorithm) 最小费用流 最小费用路方法 一般最小费用路算法(SPFA找增广路,复杂度近于O(mf),竞赛中实用) 注意:初始流的费用必须保证是在所有同流量流中最小的。

原始-对偶算法 消圈方法 一般消圈算法 网络单纯形法 常见变形 多源多汇问题 可通过增添超级源和超级汇解决。 点有容量或费用 可以尝试拆一个点为一入点一出点,将点的限制转移到入点到出点的边上。 重边、无向边和自环的处理 对于使用边链表存储的图,重边一般不需要特殊处理。但当重边的数量太多以至于显著影响算法效率时,可以考虑将相同起点终点的边的容量相加。 而无向边则可以看做是在两个方向上都只要求Flow小于Capa即可。 而最小费用流问题中的重边却反而成为一种处理复杂权函数的手段。根据题目要求或者问题性质,可以为重边列出一个费用随流量变化的函数。如果将这个函数的离散点顺次相连,得到的是若干斜率不断增大的折线段,则可为每段折线段建立一条边,根据最小费用流的性质,重边选择的必然是连续的一段。 给定流值的情况 可以增设一个源,向原来的源连一条容量为给定流值的边。 或者在每次增广的时候,直接将源的可改进量设为到给定流值的差。 或在回溯增广的时候,将路径的增广量同到给定流值的差比较后取小。 有上下界的流问题 注意到下界必须被满足,可以将所有必要弧抽取,经过新建的源和汇。但这时必须为原来的汇到源增添一条容量为无穷大的边,使之成为满足流量平衡条件的普通节点(注意,汇到源的流量实际上就是原网络的流值)。再运行最大流算法得到一个可行流。 另一方面,可以先满足下界,此时有一些点不满足流量平衡条件。而这可以用多源多汇问题解决。 若求的是最大流,则可以在可行流的基础上进行增广。 如果求的是最小可行流,则可以通过交换源汇,去除新增的点和边后运行最大流,将多余的流抵消。也可以通过二分汇到源的容量,运行可行流。 最大费用流 将费用取负,运行最小费用流算法。 或将SPFA的大于号反向。 可行最小费用流 从T向S连边,在这基础上找负权圈增广。

网络流详解(C++版)

网络流基本概念 在实际生活中有许多流量问题,例如在交通运输网络中的人流、车流、货物流,供水网络中的水流,金融系统中的现金流,通讯系统中的信息流,等等。50年代以福特(Ford)、富克逊(Fulkerson)为代表建立的“网络流理论”,是网络应用的重要组成部分。在最近的奥林匹克信息学竞赛中,利用网络流算法高效地解决问题已不是什么稀罕的事了。本节着重介绍最大流(包括最小费用)算法,并通过实际例子,讨论如何在问题的原型上建立—个网络流模型,然后用最大流算法高效地解决问题。 1.问题描述如图5-1所示是联结某产品地v1和销售地v4的交通网,每一弧(vi,vj)代表从vi到vj的运输线,产品经这条弧由vi输送到vj,弧旁的数表示这条运输线的最大通过能力。产品经过交通网从v1到v4。现在要求制定一个运输方案使从v1到v4的产品数量最多。 图5-1 图5-2 2.网络与网络流 给一个有向图N=(V,E),在V中指定一点,称为源点(记为vs,和另一点,称为汇点(记为vt),其余的点叫中间点,对于E中每条弧(vi,vj)都对应一个正整数c(vi,vj)≥O(或简写成cij),称为f的容量,则赋权有向图N=(V,E,c,vs,vt)称为一个网络。如图5-1所给出的一个赋权有向图N就是一个网络,指定v1是源点,v4为汇点,弧旁的数字为cij。所谓网络上的流,是指

定义在弧集合E上一个函数f={f(vi,vj)},并称f(vi,vj)为弧(vi,vj)上的流量(下面简记为fij)。如图5-2所示的网络N,弧上两个数,第一个数表示容量cij,第二个数表示流量fij。 3.可行流与最大流 在运输网络的实际问题中,我们可以看出,对于流有两个显然的要求:一是每个弧上的流量不能超过该弧的最大通过能力(即弧的容量);二是中间点的流量为0,源点的净流出量和汇点的净流入量必相等且为这个方案的总输送量。因此有: (1)容量约束:0≤f ij≤c ij,(v i,v j)∈E, (2)守恒条件 对于中间点:流入量=流出量;对于源点与汇点:源点的净流出量v s(f)=汇点的净流入量(-v t(f)) 的流f,称为网络N上的可行流,并将源点s的净流量称为流f的流值v(f)。 网络N中流值最大的流f*称为N的最大流。 4.可增广路径 所谓可增广路径,是指这条路径上的流可以修改,通过修改,使得整个网络的流值增大。 设f是一个可行流,P是从源点s到汇点t的一条路,若p满足下列条件: (1)在p上的所有前向弧(vi→vj)都是非饱和弧,即0≤f ij

网络流题目集锦

网络流题目集锦(转) (2010-02-07 18:00:40) 转载 标签: 分类:ACM 杂谈 最大流 POJ 1273 Drainage Ditches POJ 1274 The Perfect Stall (二分图匹配) POJ 1698 Alice's Chance POJ 1459 Power Network POJ 2112 Optimal Milking (二分) POJ 2455 Secret Milking Machine (二分) POJ 3189 Steady Cow Assignment (枚举) POJ 1637 Sightseeing tour (混合图欧拉回路) POJ 3498 March of the Penguins (枚举汇点) POJ 1087 A Plug for UNIX POJ 1149 Pigs (构图题) ZOJ 2760 How Many Shortest Path (边不相交最短路的条数) POJ 2391 Ombrophobic Bovines (必须拆点,否则有BUG) WHU 1124 Football Coach (构图题) SGU 326 Perspective (构图题,类似于WHU 1124) UVa 563 Crimewave UVa 820 Internet Bandwidth POJ 3281 Dining (构图题) POJ 3436 ACM Computer Factory POJ 2289 Jamie's Contact Groups (二分) SGU 438 The Glorious Karlutka River =) (按时间拆点) SGU 242 Student's Morning (输出一组解) SGU 185 Two shortest (Dijkstra 预处理,两次增广,必须用邻接阵实现,否则MLE)

相关文档
最新文档