Dinic算法的复杂度分析及证明

一般图

复杂度主要取决于dfs增广的过程。

将dfs部分的复杂度分成两部分来分析:1)修改增广路上边的流量。至多会增广 m m m次,一条增广路的长度至多是 n n n,所以这一部分的复杂度是 O ( n m ) O(nm) O(nm)。2)dfs遍历时找增广路失败时经过的边。由于一旦从某条边出发找最短路失败了,我们就不会再走那条边(当前弧优化),所以这一部分的复杂度是 O ( m ) O(m) O(m)的。故而dfs增广的复杂度是 O ( n m ) O(nm) O(nm)

而由于每一次重新建分层图,残余网络上 s s s t t t的最短路长度一定会增加,所以至多重建 n − 1 n-1 n1次图。

故dinic的运行时间上界为 O ( n 2 m ) O(n^2m) O(n2m)

单位图 (unit graph)

定义

单位图(unit graph) 是指,所有的边的容量都是整数,且每一个不是 s s s t t t的点,要么出度为 1 1 1,连出去的边容量为 1 1 1,要么入度为 1 1 1,连进来的边容量为 1 1 1

复杂度分析

在单位图上,至多进行 2 ⌈ n − 2 ⌉ 2\lceil \sqrt {n-2}\rceil 2n2 次dfs增广。

考虑某一次dfs增广时,现在已经得到了的流为 f f f,最大流为 f ∗ f^* f R R R f f f的残留网络。则 f ∗ − f f^* - f ff R R R上的一个流,并且 R R R是单位图。我们必然可以将 f ∗ − f f^* - f ff上容量为 1 1 1的边划分成 ∣ f ∗ ∣ − ∣ f ∣ |f^*| - |f| ff条从 s s s t t t的路径(可能还有一些环)。由于 R R R是单位图,所以除了 s , t s,t s,t以外的任意一个点至多属于一条路径,所以最短路径的长度至多为 n − 2 ∣ f ∗ ∣ − ∣ f ∣ + 1 {n-2\over |f^*|-|f|} + 1 ffn2+1

经过 ⌈ n − 2 ⌉ \lceil\sqrt {n-2}\rceil n2 次dfs增广之后,最短路的长度至少

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值