(网络流)最大流复习

本文主要复习了最大流问题,介绍了最大流的基本概念,如容量网络、弧、流量和可行流,并阐述了Dinic算法的解决思路,包括层次图和反向边的概念。Dinic算法通过不断寻找增广路并利用反向边进行调整,以达到最大流量。此外,文章还提及了算法的时间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天是2017/5/10,DCDCBigBig的第三篇博文

这段时间先把图论的一些算法复习一下,过段时间再搞数据结构吧。。。

最大流

基本概念

最大流问题(Maximum Flow Problem)是一种组合最优化问题,是网络流的基础。把问题抽象成一个有向图,从源点到汇点的每一条边都有一个最大容量,指这条边可以流过的流量最大值。问题要求的就是从源点到汇点的最大流量。注意和最长路的区别在于,它的流量可以通过多个路径流到汇点。
在求解问题之前,我们先来认识一些概念;
容量网络:我们刚才说的有向图G,即每条边都有一个最大容量的网络;
弧:就是网络中的边;
弧分四类:(设有一条弧流量为h(u,v),最大容量为c)
1,饱和弧,即h(u,v)= c;
2,非饱和弧,即h(u,v)< c;
3,非零弧,即h(u,v)< 0;
4,零弧,即h(u,v)= 0;
流量:一条弧实际所流过的流量;
可行流:满足条件1和2的一个网络流f:
1,流量限制,即每条弧的流量不能超过最大容量;
2,平衡条件限制,即每条弧流入的流量一定等于它流出的流量;
(特别地,如果一个网络上所有流量均为0,则称之为零流)
链:即从点u到u1,u1到u2,……,un到v的一条序列,其中每两个相邻的点都要连有一条弧,设L是网络G中一条从源点S到汇点T的链,则约定S到T的方向为正方向,但链中的弧方向不一定要和正方向相同。我们称链中和正方向相同的弧为正向弧,反之为反向弧;
增广路:设f是G中的一个可行流,设L是从S至T的一条链,若:
L中所有正向弧均为非饱和弧,且所有反向弧均为非零弧,
那么这条链就称为f的一条增广路,沿着增广路改进的操作叫做增广
残留容量:即在当前的可行流中弧h(u,v)的最大容量c减去已流流量f(u,v)的残余流量,记为su(u,v);
残余网络:即残余容量组成的网络,设残余网络G’,则对于G中的每一条弧h(u,v),若它是一条非饱和弧,则在G’中有一条弧h’(u,v),其最大容量c’(u,v)=c(u,v)-h(u,v),若它是一条非零弧,则在G’中有一条弧h”(v,u),其容量为c(u,v)。

问题求解

解决最大流有很多种解法,如EK、Isap、FF等,不过最有名的(主要是我们神圣的陈老师讲了的)就是dinic算法,我们今天也只介绍这一种,其他的有兴趣的童鞋可以自行百度。

dinic

学习dinic之前,我们先引入一个概念:层次图;
层次图就是分层图,一个点到源点的最短距离就叫做它的“层次”,分层图中“层次”相同的点为一层。建立分层图有一个好,就是同一层的点不可能在同一条链中,这样在找增广路时可以省去很多重复计算。
所以dinic的基本思路就是不断地根据残余网络建立层次图,然后在层次图中dfs找增广路,直到无法增广为止,这样运行速度就会快很多。下面就来看一下具体的解决精髓:反向边

反向边

我们为什么要反向边呢?看下面的一个例子(源点是1,汇点是4):

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值