1. 线性规划(Linear Programming)
1.1 问题形式
在线性约束条件下,求一个线性目标函数的最大值或最小值:
$$ \begin{aligned} \max \quad & z = \sum_{j=1}^{n} c_j x_j \\ \text{s.t.} \quad & \sum_{j=1}^{n} a_{ij} x_j \le b_i \quad (i = 1, 2, \dots, m) \\ & x_j \ge 0 \quad (j = 1, 2, \dots, n) \end{aligned} $$- 可行解:满足全部约束条件的解;
- 最优解:使目标函数取得极值的可行解;
- 可行域:所有可行解构成的集合,是一个凸多边形(凸多面体)。
1.2 重要结论
- 线性规划的可行域是凸集;
- 若线性规划有最优解,则最优解一定可以在可行域的顶点上取得;
- 单纯形法(Simplex)的基本思想就是沿着可行域的顶点迭代,每次移动到一个使目标函数值更优的相邻顶点。
1.3 整数线性规划
若要求 $x_j$ 取整数,则为整数线性规划(ILP),属于 NP 难问题,不能直接用单纯形法求解,需要分支限界法或割平面法。0-1 背包问题就是一种特殊的 0-1 整数规划。
2. 网络流(Network Flow)
2.1 基本概念
- 网络:有向图 $G = (V, E)$,每条边 $(u, v)$ 有容量 $c(u, v) \ge 0$,含源点 $s$ 和汇点 $t$;
- 可行流:满足容量限制 $0 \le f(u,v) \le c(u,v)$ 与流量守恒(除 $s$、$t$ 外,每个顶点流入量等于流出量)的函数 $f$;
- 最大流:从 $s$ 到 $t$ 的总流量最大的可行流;
- 割(Cut):把顶点集划分为含 $s$ 的 $S$ 与含 $t$ 的 $T$,割的容量为所有从 $S$ 指向 $T$ 的边的容量之和。
2.2 最大流最小割定理
定理:网络中从源点到汇点的最大流量等于最小割的容量。
即 $\max f = \min c(S, T)$,这是网络流理论的核心结论。
2.3 主要算法
| 算法 | 思路 | 复杂度 |
|---|---|---|
| Ford-Fulkerson | 反复寻找增广路径并沿路增广 | $O(e \cdot \max f)$ |
| Edmonds-Karp | 用 BFS 找最短增广路径 | $O(ve^2)$ |
| Dinic | 分层图 + 阻塞流,多路增广 | $O(v^2 e)$ |
| 最小费用最大流 | 在最大流基础上,用 SPFA/势能 Dijkstra 找单位费用最小的增广路 | $O(f \cdot ve)$ 量级 |
2.4 常见建模方法
网络流的难点在于建模,常见技巧:
- 拆点:把顶点拆成入点与出点,中间连一条容量为 1 的边,用于限制「每个点只能经过一次」(如节点容量约束);
- 超级源点 / 超级汇点:多源多汇问题转化为单源单汇;
- 二分图匹配:源点连左侧点(容量 1),左侧点连右侧点,右侧点连汇点(容量 1),最大流即为最大匹配数(König 定理);
- 上下界网络流:把下界转化为必要流量,先做可行流判定,再求最大流/最小流。
3. 典型问题
| 问题 | 所属 | 解法 |
|---|---|---|
| 最大流 | 网络流 | Dinic / Edmonds-Karp |
| 二分图最大匹配 | 网络流 | 匈牙利算法 / 最大流建模 |
| 最小路径覆盖 | 网络流 | 拆点 + 二分图匹配 |
| 最大权闭合子图 | 网络流 | 最小割建模 |
| 生产计划问题 | 线性规划 | 单纯形法 |
| 运输问题 | 线性规划 | 表上作业法 |
评论