我正在寻找快速算法来计算动态图形中的最大流量(添加/删除具有相关边缘的节点到图形)。即我们在G中有最大流量,现在添加/删除了相关边缘的新节点,我不想重新计算新图形的最大流量,事实上,我想使用此图形的先前可用结果。
任何非时间/内存消费者的预处理都是合适的。
最简单的想法是重新计算流程。
另一个简单的想法就是这样,保存以前maxflow计算中使用的所有扩充路径,现在添加顶点v
,我们可以找到从源头开始的简单路径(在前一步骤的更新容量图中),转到v
然后去目的地,但问题是这条路应该很简单,我找不到比O(n * E)更好的情况。 (如果它只是一条路径或路径是不相交的,这可以在O(n + E)中完成,但事实并非如此)。
同样对于移除节点以上的想法不起作用。
此外,我的问题与another question which looks on dynamic edges adding/removing无关。
答案 0 :(得分:1)
要添加Vertex v,请使用旧的Flow f并计算残差图,然后通过DFS OutDeg(v)次获得扩充路径。
为了移除Vertex v - 计算离开v的所有流量,假设离开v的流量之和为a,则while(a> 0)找到从s到t的路径P,该路径为v,并且减少f(P)来自流程和来自。
我认为应该有帮助......我更加确定添加然后删除,所以id喜欢在评论中得到纠正:))
答案 1 :(得分:0)
动态添加顶点v
及其相关边E
:
1)将v
单独添加到图表中。由于它没有边缘,因此不会影响最大流量。
2)使用this question
中的算法,将关联的边E
一次一个地添加到图表中
反过来删除顶点及其相关边。
答案 2 :(得分:0)
我在CSTheory.StackExchange中提出了这个问题,正如我和其他人讨论的那样添加节点我发现重新计算比其他已知算法更快,因为重新计算在半稀疏图(残差图)上运行所以它对于删除节点也足够快,有一个很好的答案,将节点(想要删除)分成两组,v_in和v_out,并计算从v_in到v_out的残差图上的流量,再次通过在源之间添加无限边缘来计算残差图中从v_in到v_out的流量和目的地。 (最后比较它们的差异并更新残差图)。 您可以在Incremental Maximum Flow in Dynamic graphs中查看相关的问答和讨论。