究竟什么是增强路径?

时间:2012-05-01 11:37:07

标签: algorithm data-structures graph network-flow

在谈到computing network flows时,Algorithm Design Manual说:

  

传统的网络流算法基于扩充路径的思想,并重复地从s到t找到正容量的路径并将其添加到流中。可以证明,当且仅当它不包含增广路径时,通过网络的流是最佳的。

我不明白什么是augmenting paths。我用Google搜索,发现:

但他们都参考了上面的引用。

任何人都可以非常清楚地解释什么是augmenting path

4 个答案:

答案 0 :(得分:46)

增强路径是一条简单的路径 - 一条不包含循环的路径 - 通过图形仅使用从源到接收器的正容量边缘。

所以上面的陈述是显而易见的 - 如果你找不到从源到接收器只使用正容量边缘的路径,那么流量就不能增加。

顺便说一下,该陈述的证明并不那么容易。

答案 1 :(得分:6)

增加意味着增加 - 增加。在给定的流量网络G=(V,E)和流量f中,扩充路径p是从剩余网络source ssink 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算法的情况下,最初所有边缘上的所有流都是零。在迭代中,我们获取每个路径/边缘的值,使我们找到称为扩充路径的流。