【发布时间】:2014-11-15 07:55:11
【问题描述】:
我有一个有向图,我想找到我可以沿着循环(循环)发送的最大流量。 标准的 Ford-Fulkerson 方法可以通过增加路径(在这种情况下为循环)起作用,还是我需要一些特别的东西? 没有源/汇,我只想循环发送流。
我想要最大化的数量是 Sum(f(i,j)),其中 f(i,j) 是沿着该边缘的流量,在所有边缘上,低于常规最大值。流约束(每条边都有一个非负的有限容量,并且每个顶点的流入(v)=流出(v))。
【问题讨论】:
我有一个有向图,我想找到我可以沿着循环(循环)发送的最大流量。 标准的 Ford-Fulkerson 方法可以通过增加路径(在这种情况下为循环)起作用,还是我需要一些特别的东西? 没有源/汇,我只想循环发送流。
我想要最大化的数量是 Sum(f(i,j)),其中 f(i,j) 是沿着该边缘的流量,在所有边缘上,低于常规最大值。流约束(每条边都有一个非负的有限容量,并且每个顶点的流入(v)=流出(v))。
【问题讨论】:
你需要做一些比扩充更复杂的事情。问题是,一旦您沿着循环发送流,您可以插入或不插入向后的剩余弧。如果你这样做了,那么没有什么能阻止你将流量发送回它的来源。如果你不这样做,那么你可以增加错误的循环。比如在图中
c-->d
^ |
| v
b-->e
^ |
| v
a<--f
如果所有弧都有单位容量,您可能会增加 a->b->e->f->a 并错过更长的循环 a->b->c->d->e->f->a。
相反,您要做的是运行 Bellman--Ford(或其他一些允许负长度的最短路径算法)来找到一个前向弧多于后向弧的循环并将其饱和。 (如果不存在这样的循环,那么你就有了一个最优解。)然后你会得到一个 O(OPT poly(n)) 边界,就像在 Ford--Fulkerson 中一样,其中所有弧都有整数容量,而 OPT 是最优目标值。您可以在circulation problems/network simplex 上搜索文献进行优化。
检测前向弧多于后向的循环:将每个前向弧的长度设置为-1,将每个后向弧的长度设置为1。将每个顶点的距离标签初始化为0(模拟人为的效果没有传入弧和长度为 0 的弧到彼此顶点的源)。运行 Bellman--Ford 判断是否存在负长循环。
【讨论】: