最大流算法的算法复杂度

时间:2017-05-10 16:54:23

标签: algorithm time-complexity max-flow network-flow

我正在学习计算机科学/运筹学,现在我对最大流量问题很感兴趣。我写了一个算法来解决这个问题,但我很难搞清楚计算的复杂性。 Python-esque伪代码如下:

function max_flow(graph,current_node,limit):
    if limit <= 0:
        return 0 
    else if node == graph.sink:
        return limit
    else:
        total = 0
        for each node connected to current_node:
            cap = graph.capacity(current_node,node)
            if cap > 0:
                next_limit = min(cap, limit - total)
                next_max_flow = max_flow(graph,node,next_limit)
                total += next_max_flow
                graph.capacity(current_node,node) -= next_max_flow
        return total

其中graph.capacity(a,b)表示从a到b的弧的容量。要查找总的最大流量,可以将算法称为max_flow(graph,graph.source,infinity)。

我向自己证明了算法是正确的(尽管如果这也是错误的,请随意纠正我),而我对复杂性的看法是算法运行在O(| V | 2 ),其中| V |是顶点的数量。理由是:

  1. 在最坏的情况下,每个节点都连接到每个其他节点,因此它是一个完整的有向图。这意味着每个节点最多都有| V | - 1条边。但是,由于偏斜对称性,如果从a到b的容量为正,则从b到a的容量必须为负。所以,如果源有| V | - 1个正容量边缘,然后下一个最高节点最多可以有| V | - 2个正容量边缘,因为至少一个边缘必须具有负容量。因此,正容量边缘的总数最多为(| V | -1)*(| V | -2)/ 2 = O(| V | 2 )。
  2. 那就是我陷入困境的地方。直观地说,它听起来像是通过| V |中的每一个节点最大为| V |次,这导致O(| V | 2 )。但是,我的一部分认为实际的复杂性是O(| V | 3 ),但我找不到任何一个严格的解释。有人能帮我推动正确的方向吗?

    注意:这些都不是作业,也不是任何课程的一部分。

1 个答案:

答案 0 :(得分:0)

复杂性

我认为由于递归调用,这对非循环图具有指数复杂性。 (对于循环图,它永远不会完成,因此具有无限的复杂性。)

实施例

假设我们有一个起始节点,100个节点排列在10 * 10网格中,以及一个汇聚节点。

开始连接到第1列中的所有10个节点(容量为1)。

x列中的每个节点都连接到列x + 1中的所有节点(容量为1)。

但没有节点连接到汇聚节点。

然后你的算法必须通过矩阵尝试所有10 ^ 10(= 10,000,000,000)条可能的路线,以发现最大流量等于0。