在准备期末考试时问这个问题。
假设您正在查看带有源s和接收器t的流动网络G。我们可以将节点分为3类。
如果对于所有最小s-t割(A,B),v位于A中,我们说节点v位于上游。
如果对于所有最小s-t割(A,B),v位于B中,我们说节点v位于下游。
如果节点v既不是上游也不是下游,则说它是中心节点;我们可以在v的上游找到一个mincut,在v的下游找到另一个mincut。
任务:给出一个采用流网络G并将其每个节点分类为上游,下游或中心的算法。算法的运行时间应在计算单个最大流量所需的时间的常数范围内。
将节点分类为上游还是下游是非常困难的,因此我的方法是找到所有中心节点。我可以对单个节点u执行此操作,首先找到G上的最大流量m,它对应于mincut。假设u在此mincut的s分量中;然后,我从u到t加上一个可忽略的容量边,然后再次找到最小切角。如果mincut保持不变,则必须有其他mincut,其中u在下游,因此u是中心节点。相反,如果mincut增加,那么我知道u在上游。 (要增加边缘容量的边缘,我将所有内容按一定比例放大,例如| E |,然后添加第1章的边缘。)
主要难于使用此方法的原因是我看不到一次为所有节点计算此方法的方法,因此我无法在恒定数量的mincut运行中获得解决方案。
另一种可能性是给定网络上的最大流量,也许有一种方法可以计算最小的mincut并从那里开始。
我走对了吗?任何提示都非常感谢!
答案 0 :(得分:1)
从最大流量出发的说法是正确的。
在流网络上运行 Fork-Fulkerson 算法 G。 假设它以流 f* 返回,残差图为 G_f*。 设 U 是 G_f* 中从源 s 可到达的节点集合。那么 U 正是上游节点的集合。
很容易看出所有上游节点都在 U 中:实际上,(U, V\U) 是最小割的,其中 U 包含源,因此根据定义,任何上游节点都必须特别属于 U。
>要看到 U 中的所有节点都在上游,假设存在一个矛盾,即 U 中的某个节点 u 不是上游。 也就是说,在 B 中有 u 的最小割 (A, B)。 考虑通过向 G 添加容量为 1 的边 (u, t) 获得的流网络 G'。 然后切割 (A, B) 在 G' 中具有与 G 中相同的容量,因为添加的边不与切割交叉,因此 min-cut(G') ≤ min-cut(G)。 另一方面,我们可以通过遵循 G_f* 中的 s->u 路径然后使用 (u, t) 来发送额外的流单元,因此 max-flow(G') ≥ max-flow(G) + 1 > 最大流量(G)。 好吧,现在通过 G 中的强对偶性,min-cut(G') ≤ min-cut(G) = max-flow(G) < max-flow(G'),但这与G' 中的弱对偶性。 因此,U 中的所有节点都必须在上游。
(请注意,我们只是为了证明而假设添加这条边——它不是实际算法的一部分!)
通过对称论证,D = {v in V |在 G_f*} 中有一条 v -> t 路径正是下游节点的集合。 中心节点则是 S \ (U union D).
该算法计算单个最大流,并使用两个 BFS(一个边缘反转)来计算集合 U 和 D,因此运行时间是可以的。