网络流
二分图匹配
二分图是指能将顶点分为两个不相交集合U和V,且所有边仅连接U中顶点与V中顶点的图。匹配问题是二分图中的核心问题,以下是几种经典解法:
匈牙利算法
匈牙利算法是求解二分图最大匹配的经典算法,核心思路是通过不断寻找增广路扩展匹配规模。
- 核心概念:
- 匹配数组
match[v]:记录V中顶点v匹配的U中顶点(未匹配则为-1)。 - 增广路:从U中未匹配顶点出发,交替经过未匹配边和匹配边,最终到达V中未匹配顶点的路径。找到增广路后,交换路径上的匹配状态即可增加一个匹配。
- 匹配数组
- 步骤:
1.遍历U中所有未匹配顶点u。
2.对每个u,通过DFS搜索增广路:枚举u的邻接顶点v,若v未访问过,标记访问状态;若v未匹配或v的匹配顶点能找到新的增广路,则更新match[v] = u,完成一次匹配扩展。
3.重复上述过程,直至无法找到增广路。 - 复杂度:O(nm),其中n为U中顶点数,m为边数。
- 正确性:若当前匹配不是最大匹配,则存在增广路可进一步扩展,反之则为最大匹配。
Hall定理
Hall定理是判断二分图是否存在X-完美匹配(X中所有顶点都被匹配)的充要条件,是二分图匹配理论的重要基础。
- 定理内容:对于二分图G=(X,Y,E),若|X|≤|Y|,则存在X-完美匹配的充要条件是:对于X的任意子集W,其邻接顶点集N_G(W)(所有与W中顶点相连的Y中顶点)满足|W|≤|N_G(W)|。
- 应用:例如,所有正则二分图(每个顶点度数相同)一定存在完美匹配,可通过Hall定理证明。
KM算法
KM算法用于求解二分图带权最大匹配(或最小匹配,只需将权值取反),适用于两集合顶点数相等的场景(不等时可补零权边凑齐)。
- 核心思想:
- 维护顶标数组
lx[](X中顶点的顶标)和ly[](Y中顶点的顶标),满足对任意边(u,v),lx[u] + ly[v] ≥ w(u,v)(w为边权)。 - 在相等子图(仅包含满足
lx[u] + ly[v] = w(u,v)的边)中寻找完美匹配,若找到则为带权最大匹配。
- 维护顶标数组
- 顶标调整:若相等子图中无完美匹配,需调整顶标以扩大相等子图范围。设S为X中访问过的顶点,T为Y中访问过的顶点,调整量
a = min{lx[u] + ly[v] - w(u,v) | u∈S, v∉T},对S中顶点顶标减a,T中顶点顶标加a,保证顶标约束仍成立。 - 复杂度:O(n³),需n次增广,每次增广涉及O(n²)的顶标调整和路径搜索。
网络流算法
网络流是研究带容量约束的流量分配问题的模型,核心是求解最大流(从源点到汇点的最大可行流量),以下是几种经典算法:
核心原理
- 反向边机制:为每条边(u,v)建立反向边(v,u),当正向边流过k单位流量时,反向边的残余容量增加k,实现“可反悔”的贪心策略,允许调整已分配的流量。
- 最大流-最小割定理:最大流的流量等于最小割的容量(最小割是将源点和汇点分离的边集,其容量为各边容量之和),是网络流算法正确性的理论基础。
常见算法
-
FF算法与EK算法:
- 两者均基于增广路思想,通过不断寻找从源点到汇点的残余路径(可分配流量的路径)并分配流量,直至无增广路。
- 区别:FF算法用DFS搜索增广路,复杂度O(Fm)(F为最大流流量);EK算法用BFS搜索最短增广路,复杂度O(nm²)(n为顶点数,m为边数),效率更稳定。
-
Dinic算法:
- 目前最常用的最大流算法,通过分层和阻塞流优化增广过程:
- BFS分层:按到源点的距离将顶点分层,仅允许从低层向高层搜索,避免无效路径。
- DFS阻塞流:在分层图中一次性搜索多条增广路,形成阻塞流(无法再通过该分层图增广的流量)。
- 当前弧优化:对每个顶点,记录上次搜索到的边,跳过已用尽流量或无效的边,避免重复检查。
- 复杂度:O(n²m),在边权为1的场景下优化为O(m√m),高效性使其成为多数网络流问题的首选。
- 目前最常用的最大流算法,通过分层和阻塞流优化增广过程:
费用流
费用流是网络流的扩展,每条边除容量外还包含单位流量费用,目标是求解最小费用最大流(或指定流量的最小费用)。
核心思路
- 每次沿最短路径(按费用计算)增广流量,确保总费用最小。若存在负费用边,可通过势能函数h[] 转换边权,消除负权后用Dijkstra算法求解最短路径。
- 势能更新:增广后,将势能函数h[i]更新为“当前最短距离 + 原h[i]”,保证转换后的边权非负,维持算法效率。
- 复杂度:若用SPFA处理负边,复杂度为O(Fnm);用Dijkstra+势能优化,复杂度为O(F(m + n log n)),其中F为最大流流量。

浙公网安备 33010602011771号