在O(V + E)

时间:2018-05-04 15:17:18

标签: graph graph-theory network-flow

首先,我想澄清一下,我已经看到了这一点:Finding 'bottleneck edges' in a graph

这并不是一个重复,只是一个不幸的巧合,这个人错误地称最低限度为“瓶颈”。

瓶颈边缘是流网络中的边缘,在增加时会增加网络的最大流量。

所以这并不是最小切割,就像o-1-> o-1> o的图形一样,我们没有瓶颈边缘,但我们确实有最小切割。< / p>

(在该示例中,o是节点,边是 - * - &gt;,其中*是某个整数。)

无论如何,所以找到所有瓶颈显然可以在O(V + E)中完成,(假设图形以邻接列表表示形式给出)并且我认为这样做的方法是创建两个大小的数组V,我将其称为INCOMING和OUTGOING,然后两次遍历邻接列表的每个元素,第一次将INCOMING [i]增加到每个节点的边缘值,第二次增加OUTGOING [j]从每个节点出来的值,其中j是我们正在读取的邻接列表的节点,i是边缘在邻接列表中进入它的节点。

我认为这适用于O(V + E)时间,但我觉得我的解决方案肯定更复杂,难以解释。有没有更好的解决方案(不比O(V + E)好,但更简单?)

2 个答案:

答案 0 :(得分:1)

对于此问题,您仍然可以使用Ford-Fulkerson算法。基本上,完成对图的迭代,直到获得最终的(断开连接)残差图为止。现在,将有一组从源S可以到达的节点。并且还将有一组从接收器T可以到达的节点。

将第一组节点连接到第二组节点的任何边缘将成为瓶颈边缘。

为什么这是正确的?试想一下,如果您增加了这些边之一的容量,那么您在第1步中获得的最终残差图将不再是最终残差图,并且福特-富克尔森算法还会有一个可能的迭代。

答案 1 :(得分:0)

此问题可以通过“中介中心性”解决。摘自Mark Needham和Amy E. Hodler的“图形算法”第5章:

“何时应使用中介中心性? 中间性中间性适用于现实网络中的各种问题。我们使用它来查找瓶颈,控制点和漏洞。”

该算法计算通过每个节点的最短路径的数量。较高的中心性分配给具有大量最短路径的节点。它在Python软件包Networkx和Neo4J

中实现