在谈到computing network flows
时,Algorithm Design Manual说:
传统的网络流算法基于扩充路径的思想,并重复地从s到t找到正容量的路径并将其添加到流中。可以证明,当且仅当它不包含增广路径时,通过网络的流是最佳的。
我不明白什么是augmenting paths
。我用Google搜索,发现:
但他们都参考了上面的引用。
任何人都可以非常清楚地解释什么是augmenting path
?
答案 0 :(得分:46)
增强路径是一条简单的路径 - 一条不包含循环的路径 - 通过图形仅使用从源到接收器的正容量边缘。
所以上面的陈述是显而易见的 - 如果你找不到从源到接收器只使用正容量边缘的路径,那么流量就不能增加。
顺便说一下,该陈述的证明并不那么容易。
答案 1 :(得分:6)
增加意味着增加 - 增加。在给定的流量网络G=(V,E)
和流量f
中,扩充路径p
是从剩余网络source s
到sink t
的简单路径Gf
}。根据{{1}}的定义,我们可以将扩充路径的边residual network
上的流量增加到容量(u,v)
,而不会违反约束,无论Cf(u,v)
和(u,v)
位于原始流量网络(v,u)
中。
此外,我们可以增加增强路径p中每条边上的流量的最大量称为G
。
证明可以在thomas h的算法介绍中找到。 cormen等......
答案 2 :(得分:3)
你如何找到从源到汇的增强路径?使用BFS的修改版本。你从源头做BFS,直到你到达接收器,只有当它有剩余容量时才会穿过边缘(即对于那个边缘,它的最大容量 - 电流> 0)。对于从源到接收器的这条路径,您可以保持最小剩余容量,这是您可以通过该路径的最大流量。获得这个想法的高级代码片段:
bool maxFlowAchieved = false;
int maxFlow = 0; // keeps track of what is the max flow in the network
while(!maxFlowAchieved)
{
//BFS returns collection of Edges in the traversal order from source to sink
std::vector<Edge*> path = BFS(source, sink);
maxFlowAchieved = path.size() == 0; // all paths exhausted
if(maxFlowAchieved)
break;
// traverse each edge in the path and find minimum residual capacity
// edge->residual = edge->maxCapacity - edge->currentflow
int allowedFlow = GetMinResidualOnPath(path);
// Now add additional flow to each edge in the path.
// i.e. for each edge in path, edge->currentflow += allowedFlow
// clearly, edge->currentflow + allowedFlow <= edge->maxCapacity
SaturatePath(path, allowedFlow);
maxFlow += allowedFlow;
}
return maxFlow;
答案 3 :(得分:-1)
迭代地从源到接收器查找流的过程。例如,在Ford-Fulkerson算法的情况下,最初所有边缘上的所有流都是零。在迭代中,我们获取每个路径/边缘的值,使我们找到称为扩充路径的流。