第五课、网络流

1. 问题1:网络流是模型而不是问题,这是什么样的模型?

1.1 模型

1.2 两个约束:

  • 容量约束:每条链路上的流量不超过容量;
  • 流约束:中间节点不存储流、从起点到达终点;除了起点和终点,流入多少,流出多少;

2. 最大流问题

2.1 问题描述

  • 给定一个图,一个起点,一个终点,找到一条从起点到终点的路径,使得流的大小最大;

2.2 Ford-Fulkerson 算法

2.2.1 核心过程
  • 找到一条路径:从起点出发,向前走,直到到达终点;
  • 构建 residual graph:根据最新找到的最大流,更新 residual graph,构建反向路径;
  • 重复上述过程,直到无法找到一条可行路径;
2.2.2 算法分析
  • 为什么输出为最大流:一旦算法停止,节点被分为两个集合,也就是一个集合的割集,算法停止的时候就是最小割的解,而最大流的上界和最小割的下界碰到一起就是最优解;

3. 为什么这个算法是正确的,这是不是多项式算法?

问题的正确性证明:对偶问题 - “最小割集”

3.2关于复杂性的讨论;

  • 什么条件下,循环会结束?答:节点被分为两个集合;
  • 每次循环向 “终点” 逼近多少?答:至少前进一个整数;
  • 终点有多远该如何理解?
  • 算法是否为多项式取决于什么?

4. 症结在哪里?如何克服?

  • 症结:每次增加的流的大小很小;
  • 克服:每次选择一个足够的增量(不大于容量总和),循环找,直到找不到了;找不到了,则将增量除以2;

我的问题:为什么是最小割?
问题:最大流是一个P问题,而不是一个NPC问题;为什么?

问题6:正确性没有问题,为什么?如何能肯定效率改进了?

将外层循环,称为 scaling phase。
加入可以知道:

  • 外循环次数:-scaling phase 个数的上限(即用到的不同数量的上限);log2();
  • 内循环的次数:任一phase 中执行augment次数;

问题7. 为什么知道最优解多远最关键?

换句话说:网络中的最大流值不大于 v(f)+m
证明方法:最小割的最大值,不超过v(f)+m。

问题8:这仍然不是传统图意义上的多项式算法。试图实现 “那种” 意义上多项式算法的思想完全不同于augment的思想。你能理解关键的差异吗?

  • Prim:过程中间结果始终满足 “可行解”的要求,但未必满足 “最小” 要求,在过程中不断 “修正” 目标值,一旦找到 “终点”,即最小可行解。
  • Kruskal:过程中间结果不具备 “可行解”特征,却体现 “最小” 的要求,一旦构成可行解,即为最优解。

你可能感兴趣的:(第五课、网络流)