Graph 在O(V+;E)中寻找图的瓶颈边

Graph 在O(V+;E)中寻找图的瓶颈边,graph,graph-theory,network-flow,Graph,Graph Theory,Network Flow,首先,我想澄清一下,我已经看到: 这并不是重复,只是一个不幸的巧合,那个人错误地把一个min cut称为“瓶颈” 瓶颈边缘是流量网络中的边缘,它在增加时会增加网络的最大流量 所以这不一定是最小割,就像o-1->o-1->o这样的图,我们没有瓶颈边,但是我们有一个最小割 (在该示例中,o是节点,边是-*->,其中*是某个整数。) 总之,显然可以在O(V+E)中找到所有瓶颈,(假设图是用邻接列表表示的),我认为这样做的方法是创建两个大小为V的数组,我称之为传入数组和传出数组,然后在邻接列表的每个元素

首先,我想澄清一下,我已经看到:

这并不是重复,只是一个不幸的巧合,那个人错误地把一个min cut称为“瓶颈”

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

所以这不一定是最小割,就像o-1->o-1->o这样的图,我们没有瓶颈边,但是我们有一个最小割

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

总之,显然可以在O(V+E)中找到所有瓶颈,(假设图是用邻接列表表示的),我认为这样做的方法是创建两个大小为V的数组,我称之为传入数组和传出数组,然后在邻接列表的每个元素中迭代两次,第一次将传入的[i]增加到每个节点的边的值,第二次将传出的[j]增加到每个节点的值,其中j是我们正在读取的邻接列表中的节点,i是邻接列表中边要到达的节点


我认为这在O(V+E)时间内有效,但我觉得我的解决方案肯定更复杂,更难解释。是否有更好的解决方案(不比O(V+E)更好,但更简单?

对于这个问题,您仍然可以使用Ford-Fulkerson算法。基本上,完成对图的迭代,直到剩下最后一个(断开连接的)残差图。现在,将有一组可从源S访问的节点,还有一组单独的可从接收器T访问的节点

将第一组节点连接到第二组节点的任何边都将是瓶颈边


为什么这是正确的?试想一下,如果你增加了其中一条边的容量,那么你在步骤1中得到的最终残差图将不再是最终残差图,而且还有一个可能的ford fulkerson算法迭代。

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

“我什么时候应该使用中间性中心性? 中间性中心性适用于现实网络中的广泛问题。我们使用它来发现瓶颈、控制点和漏洞。”

该算法计算通过每个节点的最短路径数。较高的中心性分配给通过它们的最短路径数量较多的节点。它是在Python包和Neo4J中实现的