网络流问题

一、最大流问题

问题表述:给定一幅图(n个结点,m条边),每一条边有一个容量,现在需要将一些物品从结点s(称为源点)运送到结点t(称为汇点),可以从其他结点中转,求最大的运送量。

在介绍最大流问题的解决方法之前,先介绍几个概念:反向弧,残余网络,增广路径,最大流定理。

反向弧:

    若从 u 到 v 的边的容量为 c ,这条边上有流量 f 流过(称为正向弧),则相当于从 v 到 u 有一条容量为 0 的边,其流量为 - f ,这条边就是反向弧 。

    反向弧的意义:反向弧的作用是起到有更优决策的时候会使当前选择的弧会自动放弃。反向弧有流量的原因是因为如果刚刚选择了正向弧,下一次如果存在更优策略使这 f 的流量流入汇点,就可以选择反向弧,将流量 f 撤销。

残余网络:

    计算出图中的每条边上容量与流量之差(称为残余容量),即可得到残余网络。注意由于反向边的存在,残余网络中的边数可能到达原图中边数的两倍。

    举例如下:

                                                                                    观察图-4,这种状态下它的残余网络如图-5所示:

增广路径:

    残余网络中任何一条从 s 到 t 的有向道路都对应一条原图中的增广路径 —— 只要求出该道路中所有残量的最小值 d ,把对应的所有边上的流量增加 d 即可,这个过程称为增广。

最大流定理:

    如果残留网络上找不到增广路径,则当前流为最大流;反之,如果当前流不为最大流,则一定有增广路径。

这样的话,求解最大流就只需要在残余网络中寻找增广路,直到不存在可以从 s 流向 t  的增广路,此时即为最大流。

求解最大流问题的高效算法有 dinic , sap 和 isap ,具体请看模板。

二、最小割最大流定理

割:

    将原图中所有顶点分成两个集合 S 和 T = V - S ,其中源点 s 在集合 S 中,汇点 t 在集合 T 中。如果把 ” 起点在 S 中,终点在 T 中 “ 的边全部删除,就无法从 s 到达 t 了。这样的集合划分(S,T)称为一个割,它的容量定义为:∑(边( u , v )的容量和),其中 u ∈ S , v ∈ T ,即起点在 S 中,终点在 T 中的所有边的容量和。(这里所有的边都不包括反向弧)

最小割:

    图中所有的割中,边权值和最小的割为最小割。

最小割最大流定理:

    最大流的值为最小割的容量!

如何求最小割:

    求完最大流后,在残留网络中从源点 s 开始 dfs ,将能到达的点标号( c - f >0 的边),已标号结点的集合为S,未标号结点集合为 T,则边集[ S , T ]为最小割。

定理的证明请参见刘汝佳的《算法竞赛入门经典(第二版)》(紫书)第 370 页。

三、最小费用最大流问题

问题描述:假设每条边除了有一个容量限制外,还有一个单位流量所需的费用(cost)。求在总流量最大的前提下,总费用最小的流,即最小费用最大流。

算法:与最大流算法类似,但每次用最短路 spfa 算法而非 bfs 找增广路。只要初始流是该流量下的最小费用可行流,每次增广后的新流都是新流量下的最小费用流。另外,费用值是可正可负的。具体实现方法请看模板。

时间: 2024-10-11 00:52:48

网络流问题的相关文章

hiho 第118周 网络流四·最小路径覆盖

描述 国庆期间正是旅游和游玩的高峰期. 小Hi和小Ho的学习小组为了研究课题,决定趁此机会派出若干个调查团去沿途查看一下H市内各个景点的游客情况. H市一共有N个旅游景点(编号1..N),由M条单向游览路线连接.在一个景点游览完后,可以顺着游览线路前往下一个景点. 为了避免游客重复游览同一个景点,游览线路保证是没有环路的. 每一个调查团可以从任意一个景点出发,沿着计划好的游览线路依次调查,到达终点后再返回.每个景点只会有一个调查团经过,不会重复调查. 举个例子: 上图中一共派出了3个调查团: 1

POJ2584 T-Shirt Gumbo 二分图匹配(网络流)

1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 const int inf=0x3f3f3f3f; 6 const int sink=30; 7 8 struct Edge 9 { 10 int to; 11 int next; 12 int capacity; 13 14 void assign(int t,int n,int c) 15 { 16 to=t; next=n; ca

UVA 1306 - The K-League(网络流)

UVA 1306 - The K-League 题目链接 题意:n个球队,已经有一些胜负场,现在还有一些场次,你去分配胜负,问每支球队有没有可能获胜 思路:网络流公平分配模型,把场次当作任务,分配给人,然后先贪心,枚举每个人,让这些人能赢的都赢,剩下的去建图,每个源点连向比赛容量为场次,每个比赛连向2个球队,容量无限大,每个球队连向汇点,容量为每个的人的总和减去当前已经赢的,建完图跑一下最大流,然后判断源点流出的是否都满流即可 代码: #include <cstdio> #include &l

hdu 4975 A simple Gaussian elimination problem.(网络流,判断矩阵是否存在)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4975 Problem Description Dragon is studying math. One day, he drew a table with several rows and columns, randomly wrote numbers on each elements of the table. Then he counted the sum of each row and col

POJ训练计划3422_Kaka&#39;s Matrix Travels(网络流/费用流)

解题报告 题目传送门 题意: 从n×n的矩阵的左上角走到右下角,每次只能向右和向下走,走到一个格子上加上格子的数,可以走k次.问最大的和是多少. 思路: 建图:每个格子掰成两个点,分别叫"出点","入点", 入点到出点间连一个容量1,费用为格子数的边,以及一个容量∞,费用0的边. 同时,一个格子的"出点"向它右.下的格子的"入点"连边,容量∞,费用0. 源点向(0,0)的入点连一个容量K的边,(N-1,N-1)的出点向汇点连一

HDU 3488Tour(网络流之最小费用流)

题目地址:hdu3488 这题跟上题基本差不多啊....详情请戳这里. 另外我觉得有要改变下代码风格了..终于知道了为什么大牛们的代码的变量名都命名的那么长..我决定还是把源点与汇点改成source和sink吧..用s和t太容易冲突了...于是如此简单的一道题调试到了现在..sad... 代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #

LibreOJ #6002. 「网络流 24 题」最小路径覆盖

内存限制:256 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统 评测方式:Special Judge 上传者: 匿名 网络流 最大流 屠龙宝刀点击就送 #include <cstring> #include <cstdio> #include <queue> #define N 6005 #define inf 0x3f3f3f3f using namespace std; bool flag[N]; int n,m,dep[N],nextt[N<

POJ 1273 Drainage Ditches (网络流Dinic模板)

Description Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage

网络流(进阶)

最大流:DINIC or SAP 最小费用最大流:SPFA+增广(费用的值较离散) or ZKW(费用的值集中) 有源汇的上下界最大流:新建s', t',用(i, j, l, r)表示i到j有一条下界为l上界为r的边,将每条这样的边拆成(s', j, 0, l), (i, t', 0, l), (i, j, 0, r-l),加入边(t, s, 0, max)再从s'到t'求最大流,再去掉(t, s, 0, max)这条边,从s到t求最大流 有源汇的上下界最小可行流:基本同上,将最后一步改成从t到

网络流

一.网络流 一个有向图满足一定的条件后就可称为网络流图. 如下面的有向图就是一个网络流图: 由图可知,网络流相较于有向图的特征为: 有唯一的源点S 有唯一的汇点T 每条弧都有一非负容量c[u][v] 也就是说,只要一个有向图有上面3个特征,这个图就是网络流. 二.网络流的性质 每条弧上有两个量,即容量c[u][v]和流量f[u][v],且满足f[u][v]<=c[u][v]: 若容量c[u][v]==0,则说明弧<u,v>不存在: 除点S和点T外,其余点的流入量==流出量 . [联系实际