在DAG中找到断​​开某一部分路径的最小顶点集

时间:2015-09-21 10:56:21

标签: algorithm math complexity-theory graph-theory minimum-cut

问题如下: 给定一个DAG和一个数字0 < p ≤ 1,返回最小基数集顶点,这些顶点将至少一个p - 从源(即没有传入的弧)的路径断开到接收器(即,没有传出弧线)。 对于p = 1,问题相当于最小割。但是,对于p的其他值,我不确定答案是什么。

我想到的算法是首先计算DAG的最小割集,然后尝试修剪它以满足标准。这本身很有趣,看看我们找到的子集是否实际上是给定的特定p的最小割集。这个算法的问题在于它很浪费,因为它计算了我们在最终答案中不需要的许多节点,事实上,它首先解决了“更大”的问题。

任何有关此问题解决方案的指示?对于一些min-cut算法,我们不能将这个额外的约束作为一个早期停止的标准吗?

为了检查删除了多少路径,假设我们已经为每个顶点建立了索引(并且在需要时会保持更新),这样我们就可以知道有多少路径被删除了。请不要担心更新索引的复杂性。最后一点,就尺寸或任何事物而言,对结果组件没有任何限制。

1 个答案:

答案 0 :(得分:0)

EDIT1:在看到OP的更新后,此解决方案适用于一个源u和一个接收器v的情况。

EDIT2:这实际上是一种启发式方法,请参阅下面评论中的反例。

这是一个O(V + E)解决方案,基于以下线程中提供的计算路径的方法(David Eisenstat指出,谢谢):

Number of paths between two nodes in a DAG

在第一阶段,我们将完全应用潜行者建议的“向后”方法。在此阶段结束时,我们将获取并存储以下信息:

  • 对于每个顶点i,从i到v的路径数F(i,v)

  • F(u,v),从源u到接收器的路径数v。

在第二阶段,我们继续使用相同的方法:我们模拟算法,好像问题是找到从v到u的“后向路径”。最后,我们获得:

  • 对于每个顶点i,从i到u的后向路径的数量B(i,u)。显然B(i,u)= F(u,i)

  • B(v,u)等于F(u,v)。

在第三阶段,我们计算每个顶点i,数字P(i)= F(u,i)* F(i,v)。很容易证明遍历i的(u,v)路径的数量是P(i)。因此,删除顶点i会导​​致删除P(i)路径。

在第四阶段和最后阶段,我们以贪婪的方式进行:删除具有最高P(i)的顶点,直到删除的路径总数超过p * F(u,v)

整体算法为O(V + E),因为:

  • 根据参考文献,前两个阶段是O(V + E)。

  • 第三和第四阶段显然是O(V),因此O(V + E)