Algorithm 如何在具体问题中实施福特富尔克森?

Algorithm 如何在具体问题中实施福特富尔克森?,algorithm,adjacency-list,max-flow,ford-fulkerson,Algorithm,Adjacency List,Max Flow,Ford Fulkerson,我正在做一个特定的练习,我被卡住了 要解决: 解决流通需求问题。有些工厂生产商品,有些村庄需要送货。它们由道路网络连接,每一条道路都具有最大的货物流量。问题是要找出是否存在满足需求的循环。这个问题可以转化为最大流问题。 假设每个工厂节点fi都有一个生产率pi。此外,di是village vi的需求率。您的输入将是使用每个节点的邻接列表给出的图形。首先给出一个描述图中节点数量的数字,然后给出每个节点邻接列表的一行(连同容量),例如,“DA10C5”表示节点d连接到a(容量为10)和c(容量为5)。

我正在做一个特定的练习,我被卡住了

要解决:

解决流通需求问题。有些工厂生产商品,有些村庄需要送货。它们由道路网络连接,每一条道路都具有最大的货物流量。问题是要找出是否存在满足需求的循环。这个问题可以转化为最大流问题。 假设每个工厂节点fi都有一个生产率pi。此外,di是village vi的需求率。您的输入将是使用每个节点的邻接列表给出的图形。首先给出一个描述图中节点数量的数字,然后给出每个节点邻接列表的一行(连同容量),例如,“DA10C5”表示节点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只能使用一个源和一个汇。在这个问题中,我们有测试用例,例如有3个工厂和2个村庄。有人能给我点启发吗,因为我真的被卡住了。

这是一个典型的单源单汇Ford-Fulkerson算法的扩展。在本质上,您认为另一个“虚构”节点<代码> u>代码>是1个源,并将该节点<代码> u>代码>连接到所有工厂。(即,问题中的
K
来源是什么)

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


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

我想我理解这个概念的可能重复。非常感谢。由于每个村庄都有特定的需求,所以我不太理解您将它们全部连接到水槽的方法。(因为已经证明每个村庄都有一个负值,例如-5)同样,你知道我是否可以使用另一种算法来解决具体问题吗?