网络流量:添加新边缘

时间:2011-11-05 11:34:48

标签: java c++ performance algorithm data-structures

在最近的一次比赛中,我被要求设计一种算法,for a network having V vertices and E edges, if by adding an edge (it's capacity should be 1) results in increase the maximum flow.我们必须设计这样的算法才能找到这样的边缘。

算法应该比O(|E|* h(|V||E|))更快,其中h(|V||E|)是计算最大流量所花费的时间。

提前致谢。如果不清楚,请告诉我。

4 个答案:

答案 0 :(得分:1)

(菲利普所说的更正版本。)计算最大流量。提取由具有正剩余容量的弧组成的无容量有向图。当且仅当存在从源到尾部以及从头到水槽的路径时,添加特定弧会增加最大流量,即,弧的引入会产生增强路径。

在您的示例{s->a, a->b, a->c, a->d, b->t, c->t, d->t}中,最大流量为s-3>a, a-1>b, a-1>c, a-1>d, b-1>t, c-1>t, d-1>t,剩余图表具有每个后向弧{a->s, b->a, c->a, d->a, t->b, t->c, t->d}。从s可到达的顶点是{s},从t可到达的顶点是{t},因此唯一可以增加最大流量的单个弧是s->t

答案 1 :(得分:0)

根据Max-Flow-Min-Cut-Theorem [1],网络中的最大流量等于最小切割中所有边缘权重的总和。因此,解决方案可能如下所示:

  • 通过使用例如{li>找到具有总边缘权重X的最小切割。 Edmonds-Karp算法,Ford-Fulkerson算法的专业化。根据[1],这是O(h|V||E|)
  • 添加一条边连接属于剪切(S, S')的不同分区的节点,即添加(u,v)位于uS的边v }在S'
  • 重复,直到不再有总边重为X的切割。

答案 2 :(得分:0)

我认为解决方案可以是:

  1. 首次运行最大流量算法。现在,我们有残差图G。
  2. 然后我们找到所有边(u,v),使得在残差图G中,我们可以找到从s到u的路径和从v到t的路径。
  3. 最坏情况的复杂性是O(| V | ^ 2(| V | + | E |)+ h(| V || E |))。

答案 3 :(得分:0)

另一种解决方案可能如下:

步骤1.找到包含最小顶点数的最小切割(称为顶点Vmin)。

步骤2.找到包含最大顶点数的最小切割(调用其顶点Vmax)。

步骤3。找到链接Vmin和V \ Vmax但不属于E的所有边。

为什么这样做? (I)添加新的uv边缘是好的,如果它包含在每个最小切割中(确切地说:如果它链接最小切割的不同组件)和(II)最小切割的“组”接近联合和交集。

复杂度:

对于Step1,2,我发现了以下好的algorythm:How can I find the minimum cut on a graph using a maximum flow algorithm?。这可以应用于找到具有最小和最大顶点的最小切割。这似乎在h(| E || V |)+ O(| V | ^ 3)中运行,其中O(| V | ^ 3)来自BFS,当您检查BFS是否结束时(即不再是新的)剩余相邻存在)。

对于Step3,其中O(| Vmin | * | V \ Vmax |)为O(| V | ^ 2)。

因此Step1,2,3 = h(| E || V |)+ O(| V | ^ 3)

请注意,这只是一个快速草图:)