问题如下:
给定一个DAG和一个数字0 < p ≤ 1
,返回最小基数集顶点,这些顶点将至少一个p
- 从源(即没有传入的弧)的路径断开到接收器(即,没有传出弧线)。
对于p = 1
,问题相当于最小割。但是,对于p
的其他值,我不确定答案是什么。
我想到的算法是首先计算DAG的最小割集,然后尝试修剪它以满足标准。这本身很有趣,看看我们找到的子集是否实际上是给定的特定p
的最小割集。这个算法的问题在于它很浪费,因为它计算了我们在最终答案中不需要的许多节点,事实上,它首先解决了“更大”的问题。
任何有关此问题解决方案的指示?对于一些min-cut算法,我们不能将这个额外的约束作为一个早期停止的标准吗?
为了检查删除了多少路径,假设我们已经为每个顶点建立了索引(并且在需要时会保持更新),这样我们就可以知道有多少路径被删除了。请不要担心更新索引的复杂性。最后一点,就尺寸或任何事物而言,对结果组件没有任何限制。
答案 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)