• 网络流算法


    网络流

    本文参考了南京大学蒋炎岩老师的讲解(B站视频链接)

    考虑割的定义

    对于有向图 G ( V , E ) G(V,E) G(V,E)
    对于DFS/BFS,每次搜索会将新的节点 v ∈ V v \in V vV 纳入已经搜索的集合 S S S

    则对于尚未搜索的部分,定义为集合 V − S = T V - S = T VS=T,则必然存在 S , T S,T S,T 满足 G G G s − t s-t st

    • S ∩ T = V , S ∪ T = ∅ S \cap T = V, S \cup T = \emptyset ST=V,ST=
    • s ∈ S , t ∈ T s \in S, t \in T sS,tT

    即起点/终点分别位于两个集合当中,这个边集合称作割

    定义割的大小 ∣ { ( u , v ) ∈ E ∣ u ∈ S , v ∈ T } ∣ |\{(u,v) \in E|u \in S, v \in T\}| {(u,v)EuS,vT},即按照 S → T S \rightarrow T ST 方向穿过割的边数

    因此对于 G G G 中任意两点间 s → t s \rightarrow t st找不到路径,等价于至少存在一个 s ∈ S , t ∈ T s \in S, t \in T sS,tT s − t s-t st 割大小为 0 0 0

    不止一条路径

    G G G 中有多少不相同的 s → t s \rightarrow t st

    • 可共享节点,不能共享边

    对于大小为 n n n s → t s \rightarrow t st 割,必然存在至多 k ( k ≤ n ) k(k \leq n) k(kn) s → t s \rightarrow t st 的路径(上界)。

    同时,如果能找到 m ( m ≤ k ) m(m \leq k) m(mk) 条不相交路径(下界),就证明了一共有 k k k 条不相交路径。

    寻找不相交路径的数量

    Ford-Fulkerson 算法

    1. 使用DFS/BFS找到一条路径 L L L
    2. 对于 e ∉ L e \not\in L eL,保持方向不变,对于 e ∈ L e \in L eL,将其反向
    3. 对于更新后的图(称作残余网络),重复步骤 1 , 2 1,2 1,2,若不满足 1 1 1,则终止
      对于终止的 Ford-Fulkerson 算法,必有割 s → t s \rightarrow t st 大小为 0 0 0.

    当算法终止时,假设有 m m m 条路径,则必有真实路径数 k , k ≥ m k,k \geq m k,km,若同时有最小割 t = m t = m t=m,则必有路径数量为 k k k

    最大流和最小割

    考虑带权图

    带权图等价于多重边。如权重为 20 20 20 的边 a → 20 b a \rightarrow_{20}b a20b,等价于 20 20 20 条权重为 1 1 1(无权)的边即 20 × a → b 20 \times a\rightarrow b 20×ab

    边的权值称作容量

    若存在 p p p 条有重复边的路径 { x 1 , . . . , x p } \{x_1,...,x_p\} {x1,...,xp},则定义了如下的线性优化目标
    min ⁡ ∑ i = 1 p x i \min \sum\limits ^{p}_{i = 1} x_i mini=1pxi
    其满足约束条件

    x 1 + . . . ≤ a x 2 + . . . ≤ b … x i ≥ 0 x_1 + ... \leq a \\ x_2 + ... \leq b\\\dots\\x_i \geq 0 x1+...ax2+...bxi0
    其中 a , b , . . . a,b,... a,b,... 表示 x 1 , x 2 , . . . x_1,x_2,... x1,x2,... 公共边中最小的容量。这就是网络流的原始表述。

  • 相关阅读:
    【微信小程序模板直接套用】微信小程序制作模板套用平台
    软件加密系统Themida应用程序保护指南(九):通过命令行进行保护
    操作系统——吸烟者问题(王道视频p34、课本ch6)
    实用设计模式实战:工厂+策略
    【FPGA教程案例82】接口案例2——通过串口从PC发射坐标指令到FPGA,将该坐标信息控制HDMI显示屏中物体的位置
    数据结构之红黑树
    [Git 知识小结]
    pandas使用dataframe的索引和数据列同时对dataframe数据进行排序、使用ascending参数指定索引和数据列的排序方向(升序或者降序)
    【FreeRTOS-----笔记(基础)】
    JSON.parse()和JSON.stringify()的使用
  • 原文地址:https://blog.csdn.net/qq_44458671/article/details/128026736