网络流

二分图匹配

二分图是指能将顶点分为两个不相交集合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,实现“可反悔”的贪心策略,允许调整已分配的流量。
  • 最大流-最小割定理:最大流的流量等于最小割的容量(最小割是将源点和汇点分离的边集,其容量为各边容量之和),是网络流算法正确性的理论基础。

常见算法

  1. FF算法与EK算法

    • 两者均基于增广路思想,通过不断寻找从源点到汇点的残余路径(可分配流量的路径)并分配流量,直至无增广路。
    • 区别:FF算法用DFS搜索增广路,复杂度O(Fm)(F为最大流流量);EK算法用BFS搜索最短增广路,复杂度O(nm²)(n为顶点数,m为边数),效率更稳定。
  2. 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为最大流流量。
posted @ 2025-08-12 23:09  ᝰꫛꫀꪝ_yqy  阅读(45)  评论(0)    收藏  举报
/**手机适配**/ @media only screen and (max-width: 767px) { header{width:100%} .banner{width: 100%;height: 100px;} .avatar{width: 80px;height: 80px;margin: 6px;} .avatar a{padding-top: 59px;width: 80px;height: 80px;background-size: 80px 78px;} .avatar a span{margin-top: 0px; padding-top: 0px; width: auto;height: auto;} .bloglist h3 {margin: 20px 0 10px 10px;} .bloglist figure {width:auto;margin-left: 4px;} .bloglist figure img {width: 90px;height: 60px;} .bloglist ul{width:64%} .dateview {width:100%;padding-left:4px;} .dateview span {margin: 0 3px;} .weixinnone,.thumbs{display: none} .right{width: 100%;margin-top: 22px} .right ul{width:64%;margin-left: 22px;} .weather{margin: 20px 50px;} .bloglinkli{display: block} footer{width:100%} }