我有一个图G是一个有向和强连通的图,我被要求找到所有顶点对的最小切割,这意味着图中的每对S和T.这应该在O(m 2 ×n 2 )时间内完成。
我想出的最好的方法是将所有顶点都视为S,并且对于每个S,将所有其他顶点视为T,并且对于每个顶点运行Ford-Fulkerson算法,然后找到最小切割。但如果我没有弄错的话,这个算法将具有O的复杂度(m 2 ×n 2 ×C)。
如何在O(m 2 ×n 2 )时间内完成此任务?它甚至可能吗?
答案 0 :(得分:1)
记号:
m
:边数为n
:节点数量c_max
:最大单边容量为C
:最大流量值。
Dinic's algorithm可以解决手头的任务。它在O(m * n^2)
中运行。 O(n^2)
min cut计算的强力方法然后产生总共O(m * n^2 * n^2)
,这是m = O(n^2)
的期望结果。对于m = o(n^2)
的稀疏图,我无法找到明确的结果;但是,对于m = O(n)
this paper,结果为O(n^2 + n^4 * log n) = O(m^2 * n^2 * log n)
。
有几种算法可以在有向图中计算最小切割(或等效地,最大流量),其复杂性保持低于O( m * n^2 )
。 Wilf H.S., Algorithms and Complexity, 1st ed.在第65页进行了调查。最易于访问的算法可能是Dinic(O(m * n^2)
)。
虽然乍一看Ford-Fulkerson算法的时间复杂度高O( m * C )
,但它有一些严重的缺点:
时间复杂度仅对整数边缘容量有效。实际上,由于边缘容量不合理,算法甚至不能保证终止,也不能收敛到最大流量(参见this paper以获得可证明最小的反例;本文也在维基百科文章中引用)。 / p>
时间复杂度取决于最大流量的值。
流量值的重要性
最大流量值C
不一定是节点和边数的函数。即使它(取决于图形拓扑),以下观察也成立:任何图中的最大可能流量值是边数乘以最大边缘容量m * c_max
金额为O(m)
。
将整数边缘容量的Ford-Fulkerson的复杂性转换为O(m^2)
,除非单个边的最大容量是图中节点或边数的函数,这是非标准的假设
对于其他算法没有任何影响,因为它的执行取决于图形拓扑和相对于彼此的边缘容量,而不是绝对边缘容量(因此,也不是最大流量值的函数)