最大流问题

来自testwiki
跳转到导航 跳转到搜索

Template:NoteTA

一个网络最大流的例子。源点为 s,汇点为 t。数字表示流和容量。

在优化理论中,最大流问题Template:Lang-en)涉及到在一个单源点、单汇点的网络流中找到一条最大的流。

最大流问题可以被看作是一个更复杂的网络流问题(循环问题,circulation problem)的特殊情况。s-t流(从源点s到汇点t)的最大值等于s-t割的最小容量,这被称为最大流最小割定理

历史

最大流问题最早是在1954年由Template:Le和F·S·羅斯(F. S. Ross)通过一个苏联铁路的交通流量的简化模型提出的。[1][2][3] 1955年,小萊斯特·倫道夫·福特德爾伯特·雷·富爾克森创建了第一个已知的算法,福特-富爾克森算法[4][5]

多年来,最大流问题的各种改进算法被发现,例如Template:Le理查德·卡普Template:Le最短增广路算法;迪尼茨的阻塞流算法Template:Le羅伯特·塔揚的Push-Relabel算法;戈德堡和Rao的binary阻塞流算法;Christiano、Kelner和亞歷山大·馬德瑞(Aleksander Madry)的电流算法;Spielman发现一个最大流近似最优解,但仅适用于无向图。[6][7]

定义

一个网络流,源点为 s,汇点为 t。边上的数字为容量。

N=(V,E)为一个网络,其中st分别是N的源点和汇点(s,tV)。

一个边的容量为映射c:E+,记为cuvc(u,v)。它表示可以通过一条边的流量的最大值。
一个为一个映射f:E+,记为fuvf(u,v),遵循下面两个限制:
  1. 对于每个(u,v)E,有fuvcuv(即容量限制:一个边的流量不能超过它的容量);
  2. 对于每个vV{s,t},有u:(u,v)Efuv=u:(v,u)Efvu(即流的保留:流入一个节点的流的总和必须等于流出这个节点的流的总和,源点和汇点除外)。
流量定义为 |f|=v:(s,v)Efsv,其中sN的源点,它表示从源点到汇点的流的数量。
最大流问题就是最大化|f|,即从s点到t点尽可能规划最大的流量。

解法

算法 复杂度 描述
线性规划
福特-富爾克森算法 Template:Math
埃德蒙兹-卡普算法 Template:Math 福特-富爾克森算法的特例,使用广度优先搜索寻找增广路径.
迪尼茨阻塞流算法 Template:Math
MPM (Malhotra, Pramodh-Kumar and Maheshwari)算法[8] Template:Math 只适用于无环图。参考 Original Paper.
Dinic算法 Template:Math
push-relabel maximum flow算法 Template:Math
Push-relabel算法,使用FIFO vertex selection rule Template:Math
Push-relabel算法,使用 dynamic trees O(VElogV2E)
KRT (King, Rao, Tarjan)算法[9] O(EVlogEVlogVV)
Binary阻塞流算法[10] O(Emin(V23,E)logV2ElogU)
James B Orlin's + KRT (King, Rao, Tarjan)算法[11] O(VE) Orlin's algorithm Template:Wayback solves max-flow in O(VE) time for EO(V1615ϵ) while KRT solves it in O(VE) for E>V1+ϵ.

参考文献

Template:Reflist

Template:算法