我有一个有向图,我想找到我可以沿循环(循环)发送的最大流量。 标准的Ford-Fulkerson方法是否可以工作,增加路径(在这种情况下是周期),还是需要特殊的东西? 没有源/汇,我只想沿着循环发送流量。
我想要最大化的数量是Sum(f(i,j)),其中f(i,j)是沿着该边缘,在所有边缘,在常规最大值下的流动。流量约束(每个边缘都有一个非负的有限容量,流入(v)=每个顶点的流出量(v))。
答案 0 :(得分:0)
你需要做一些比增强更复杂的事情。问题是,只要沿循环发送流量,就可以插入反向残留弧。如果你这样做,那么没有什么可以阻止你将流量发回到它来自的地方。如果你不这样做,那么你可以增加错误的周期。例如,在图表中
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))绑定,如福特 - 富尔克森,其中所有弧都有整数容量,OPT是最佳目标值。您可以对circulation problems / network simplex上的文献进行搜查以进行优化。
要检测前向弧比后向弧多的周期:将每个前向弧的长度设置为-1,将每个后向弧的长度设置为1.将每个顶点的距离标签初始化为0(模拟人工的效果)源没有传入弧,长度为0弧到彼此顶点)。运行Bellman - Ford确定是否存在负长度周期。