Java 如何使用Edmonds–;卡普算法?

Java 如何使用Edmonds–;卡普算法?,java,algorithm,pseudocode,edmonds-karp,Java,Algorithm,Pseudocode,Edmonds Karp,我使用在Edmonds–Karp算法wiki页面中找到的伪代码实现了Edmonds–Karp算法: 它工作得很好,但是算法输出是最大流量值(最小切割值),我需要查看此切割包含的边列表 我试图改变算法,但没有成功,你们能帮忙吗 谢谢如果您已经知道最大流,那么最小割是(S,T),其中S是剩余网络中可从源到达的顶点集,T是互补集。连接S顶点和T顶点的边属于切割。如果已经有流,则计算残差图。然后从源位置进行深度优先搜索(或者广度优先搜索,我认为这并不重要),以计算一半切割中的顶点。其余顶点位于切割的另一

我使用在Edmonds–Karp算法wiki页面中找到的伪代码实现了Edmonds–Karp算法:

它工作得很好,但是算法输出是最大流量值(最小切割值),我需要查看此切割包含的边列表

我试图改变算法,但没有成功,你们能帮忙吗


谢谢

如果您已经知道最大流,那么最小割是(S,T),其中S是剩余网络中可从源到达的顶点集,T是互补集。连接S顶点和T顶点的边属于切割。

如果已经有流,则计算残差图。然后从源位置进行深度优先搜索(或者广度优先搜索,我认为这并不重要),以计算一半切割中的顶点。其余顶点位于切割的另一半T中


这会让你的伤口(S,T)。如果你特别想要S和T之间的边,你可以遍历所有的边,选择连接S和T的边(尽管最后一部分可能有一种更简单的方法。)

这里有一些指针,可以帮助你为将来的任何人阐明如何做到这一点

  • 若要查找S顶点,请从源顶点执行BFS(或DFS)搜索,仅在剩余流量的边之后进行搜索。(换句话说,非饱和边)。根据定义,这些都不可能是切碎的

  • 要查找T顶点,请从汇顶点执行BFS(或DFS)搜索,仅连接到尚未添加到S集的顶点。这些可能有剩余流量,或者可能完全饱和,这无关紧要。因为您是从水槽执行BFS,所以需要确保遵循相反的方向,如果图形是定向的,则边是指向的。注意:在T集中只包含可以从水槽到达的顶点很重要,否则最终会在最小切割中包含不属于该顶点的边。(这让我很长时间都很沮丧。)

  • 一旦有了这两组顶点,就可以在图的所有边上迭代。在S中有一个源节点,在T中有一个目标节点的任何人都是最小割集的一部分。但需要注意的是,这只是许多可能的最小切割之一。在一个图中找到所有可能的s-T最小割集要耗费大量的时间


  • 希望这有助于任何未来的互联网人试图弄明白这一点!祝你好运

    我只知道最小切割值…不知道set@ciochPep你说你实施了Edmonds Karp?它与值一起查找流。你能解释fnxn矩阵中数字的含义吗?我该如何准确地使用它们?@ciochPep F[I,j]是沿着I到j的边缘的流。在实际算法中,它可能表示为一列边,而不是一个矩阵。你可以解释fnxn矩阵中数字的含义吗?我该如何准确地使用它们?@ciochPep:矩阵F给出了图中每一条边的流量,以实现最大流量——本质上,埃德蒙·卡普算法就是为了计算这些流量而设计的。这也使得计算残差图变得简单:它只是矩阵C和矩阵F的差。