我使用我在Edmonds-Karp算法维基页面中找到的伪代码实现了Edmonds-Karp算法:http://en.wikipedia.org/wiki/Edmonds%E2%80%93Karp_algorithm
它工作得很好,但算法输出是最大流量值(最小切割值),我需要这个切割包含的边缘列表
我试图更改算法,没有成功,你们可以帮忙吗?
谢谢
答案 0 :(得分:3)
如果您已有流量,则计算残差图。然后从源(或广度优先搜索,我认为不重要)进行深度优先搜索,以计算切割的一半(S)中的顶点。其余的顶点位于切割的另一半,T。
这会给你剪切(S,T)。如果您特别想要S和T之间的边缘,您可以遍历所有边缘,选择连接S和T的边缘。(尽管可能有一种更优雅的方式来完成最后一部分。)
答案 1 :(得分:2)
如果您已经知道最大流量,那么最小切割是(S,T),其中S是从残余网络中的源可到达的顶点集合,T是互补集合。连接S的顶点和T的顶点的边属于切口。
答案 2 :(得分:1)
以下是一些指示,以帮助澄清如何在将来为任何人做到这一点。
要查找S顶点,请从源顶点执行BFS(或DFS)搜索,仅在其中保留一些流量容量的边缘之后进行搜索。 (换句话说,非饱和边缘)。根据定义,这些不能在mincut中。
要查找T顶点,请从 sink 顶点执行BFS(或DFS)搜索,仅连接到尚未添加到S集的顶点。这些可能有残余流动,或者可能完全饱和,无关紧要。因为您正在从接收器执行BFS,所以如果图形是定向的,您需要确保沿着相反的方向指向边缘。注意:重要的是只包含可以从T组中的接收器到达的顶点,否则最终会在最小切口中包含不属于那里的边缘。 (这就是让我长时间离开的原因。)
一旦有了这两组顶点,就可以迭代图的所有边。任何在S中具有源节点且在T中具有目标节点的人都是最小切割的一部分。然而,重要的是要注意,这只是许多可能的最小削减的一个。在图表中找到所有可能的S-T最小割数要花费更多的时间。
希望这可以帮助任何未来的互联网用户试图解决这个问题!祝你好运!