在最近的一次比赛中,我被要求设计一种算法,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|)
是计算最大流量所花费的时间。
提前致谢。如果不清楚,请告诉我。
答案 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],网络中的最大流量等于最小切割中所有边缘权重的总和。因此,解决方案可能如下所示:
X
的最小切割。 Edmonds-Karp算法,Ford-Fulkerson算法的专业化。根据[1],这是O(h|V||E|)
。(S, S')
的不同分区的节点,即添加(u,v)
位于u
和S
的边v
}在S'
。X
的切割。答案 2 :(得分:0)
我认为解决方案可以是:
最坏情况的复杂性是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)
请注意,这只是一个快速草图:)