具有下限的网络中的最小流量-我做错了啥?

Posted

技术标签:

【中文标题】具有下限的网络中的最小流量-我做错了啥?【英文标题】:Minimum flow in a network with lower bounds - what am I doing wrong?具有下限的网络中的最小流量-我做错了什么? 【发布时间】:2015-05-29 19:09:57 【问题描述】:

我要解决的问题如下:

给定一个有向图,找出“覆盖”整个图的最小路径数。多条路径可能经过同一个顶点,但路径的并集应该是所有路径。

对于给定的示例图(见图),结果应该是 2(1->2->4,并且 1->2->3 就足够了)。

通过分割顶点并为连接入顶点和出顶点的每条边分配 1 的下限,并将源链接到每个入顶点,将每个出顶点链接到汇(它们不是如图所示,因为它会使整个事情变得混乱),现在的问题是在图中找到具有下限约束的最小流量。

但是,我已经读过,为了解决这个问题,我必须找到一个可行的流程,然后按如下方式分配容量:C(e) = F(e) - L(e)。但是,通过给每条Source-vertex edge、vertex-Sink edge、In-Out edge分配一个flow为1,可行的flow是正确的,总的flow等于顶点的个数。但是通过分配新容量,进出边(标记为蓝色)的容量为 0(它们的下限为 1,在我们选择可行流时,它们的流为 1),并且没有流动是可能的。

图。 2:我如何选择“可行流程”

但是,从图中您可以清楚地看到,您可以引导一个满足每个“顶点边缘”下限的 2 流。

我对最小流量算法的理解有误吗?哪里错了?!

【问题讨论】:

当我找到可行流时,我是否应该确保每条边上的流都大于最小流问题的解?因为如果不是,那么我看不到算法可以为我提供良好流程的任何方式。 【参考方案1】:

一旦您有了可行的流量,您需要通过将流量从汇返回源来开始“修剪”它,但要遵守下限和容量限制(实际上只是剩余容量)。下方的两个黑色边缘用于正向,因为它们还没有流动。涉及源和汇的边被反向使用,因为我们正在撤消它们上已经存在的流。如果您开始从剩余容量的角度考虑所有这些,那将更有意义。

【讨论】:

那么,当我反转边缘时,我只反转源和汇的边缘?因为,如果我反转整个图并计算从 t 到 s 的最大流量,我仍然一无所获(考虑到进出边的容量为 0)。我究竟要如何取消流程?从图中可以看出,您无法取消每个单独的流程,因为它们没有连接,并且取消一个会破坏下限约束 @lbicsi 你把有流的那些倒过来。 换句话说,我为每个前向边缘分配容量 C(e) - F(e),为每个后向边缘分配 F(e) - L(e)?这就是答案吗? 另外,如果一条边在两端都有容量,那不会以任何方式违反算法,对吧?还是我必须再次分割后边缘(即在两个相邻节点之间添加一个辅助节点)

以上是关于具有下限的网络中的最小流量-我做错了啥?的主要内容,如果未能解决你的问题,请参考以下文章

C# 中的 XML 多行注释 - 我做错了啥?

JavaScript 中的 HTML5 音频:我做错了啥?

用 C++ 中的 AKS 素性测试计算孪生素数我做错了啥?

Xcode 中的 else if 或 or 语句。不知道我做错了啥

R语言中的一类分类。生成混淆矩阵时我做错了啥?

Gmail API 中的 VacationSettings.endTime 转换为错误的日期 - 是错误还是我做错了啥?