如何针对特定问题实施福特福克森?

时间:2019-03-17 12:22:35

标签: algorithm adjacency-list max-flow ford-fulkerson

我正在做一个特定的运动,但被困住了。

解决:

  

解决流通需求问题。有一些工厂生产货物,有些村庄则必须将货物交付。它们通过道路网络相互连接,每条道路都具有最大能力通过该道路流动的货物。问题在于确定是否存在满足需求的流通量。该问题可以转化为最大流量问题。     假设每个工厂节点fi具有生产率pi。另外,di是村庄vi的需求率。您的输入将是使用邻接表为每个节点提供的图。首先给出一个描述图的节点数的数字,然后给出每个节点的邻接表的一行(连同容量),例如“ d a 10 c 5”表示节点d连接到a(容量为10)和c(容量为5)。最后,给出每个节点(有工厂的地方)的生产率,然后再给出每个节点上村庄的需求率。

据我了解,我需要这样的输入文件:

10
a b 10 c 20
b c 5 d 10
d e 7 f 8
a 10
e -5

//nodes = 10  
//directed graph -> a to b with capacity 10, a to c with capacity 20  
//a production = 10, e consumption = -5

我得出的结论是,我应该使用Ford-Fulkerson算法来找到最大流量(因为这是输出所要求的值)

围绕算法的不同实现(我正在考虑使用C或Java对其进行编码),我偶然发现了以下问题:

Ford-Fulkerson仅可用于1个源和1个接收器。在这个问题中,我们有测试用例,其中有3个工厂和2个村庄。有人可以启发我,因为我真的被困住了。

1 个答案:

答案 0 :(得分:1)

这是1源1陷Ford-Fulkerson算法的典型扩展。本质上,您将另一个“虚构”节点U视为第1个源,并将该节点U连接到所有工厂。 (即您问题中的K来源)

类似地,您将所有M个汇点(即村庄)连接到您添加到给定图中的另一个虚构汇点节点V。然后,当您计算从UV的最大流量时,您将已经计算出从所有工厂到所有村庄的最大流量。

显然,应该考虑将U连接到工厂的边缘和将村庄连接到V的边缘的权重。在您的情况下,从U到工厂的每个传入边的权重应等于该工厂的容量。如果边缘将村庄连接到V,则不需要定界,因此它可以高达整个图中最高的权重,也可以等于可以表示无穷大的实用值。