Algorithm 查找DAG中断开某部分路径的最小顶点集

Algorithm 查找DAG中断开某部分路径的最小顶点集,algorithm,math,complexity-theory,graph-theory,minimum-cut,Algorithm,Math,Complexity Theory,Graph Theory,Minimum Cut,问题如下: 给定一个DAG和一个数字0

问题如下: 给定一个DAG和一个数字
0
,返回顶点的最小基数集,该集合至少断开了从源(即没有传入弧)到汇(即没有传出弧)的路径的一部分。 对于
p=1
,问题相当于最小切割。但是,对于
p
的其他值,我不确定答案是什么

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

有解决这个问题的方法吗?对于min-cut的一些算法,我们是否可能将这个额外的约束作为早期停止标准


为了检查删除了多少条路径,假设我们已经为每个顶点编制了索引(并在需要时保持更新),以便知道有多少条路径因删除而断开连接。请不要担心正在更新的索引的复杂性。最后一件事,结果组件在大小或任何方面都没有约束。

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

EDIT2:这实际上是一种启发,请参见下面评论中的反例

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

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

  • 对于每个顶点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)


    • 这里有一个获得近似最优解决方案的想法

      这里有一个集合覆盖的变体,我想称之为部分集合覆盖,其中我们有集合和元素,并且想要最小数量的集合,其并集包含元素的p分数。为了解决这个问题,集合对应于节点,元素对应于最大路径(是的,路径太多,无法简单地执行此操作;请参见下文。)当且仅当节点包含在路径中时,集合才包含元素

      作为一个整数程序编写部分集合覆盖并不难

      minimize sum_{sets S} x_S
      subject to
      for all elements e, sum_{sets S containing e} x_S >= y_e
      sum_{elements e} y_e >= p * number of elements
      for all sets S, x_S in {0, 1}      # 1 if set S is chosen
      for all elements e, y_e in [0, 1]  # 1 if element e is covered
      
      该程序可由整数程序解算器求解。求解者出人意料地优秀,尽管他们当然不能保证这个NP难集覆盖泛化的最优解

      在一个有趣的DAG中,当然有太多的路径需要枚举。救命啊!因为在DAG中很容易计算最大路径,所以很容易对它们进行随机均匀采样。对多个路径进行采样,并将其用作integer程序中的元素

      minimize sum_{sets S} x_S
      subject to
      for all elements e, sum_{sets S containing e} x_S >= y_e
      sum_{elements e} y_e >= p * number of elements
      for all sets S, x_S in {0, 1}      # 1 if set S is chosen
      for all elements e, y_e in [0, 1]  # 1 if element e is covered
      

      折衷是,路径越多,目标的估计越好,但求解整数规划的时间越短。给出一些关于正确选择样本数量的提示。对于n个顶点,有2^n个可能的解决方案。我们希望每一个的估计分数都精确到某个ε以内。霍夫丁说,我们需要选择样本数为θ(n/epsilon^2),这样,几乎所有的时间,所有的估计都是近似正确的。我会计算出精确的常数,但我怀疑它是否实际相关。

      s-t路径对于某些给定的指定顶点s和t?或任何路径?一组顶点如何断开任何连接?你们的意思是顶点的二分,不同部分的顶点之间的所有边都被认为是被删除的吗?我也不确定p=1是否等于最小切割:p=1意味着所有顶点对之间的所有路径都必须被破坏,意味着所有边都必须被删除。即使你只是指“二分体不同部分的顶点之间的路径”,min cut也不一定会返回一个使“最小基数集”(我在这里认为是min(| a |,| B |))最小化的二分体(a,B)。@j|u random|hacker第二种情况实际上是有意义的。据我所知,OP希望最小化切割顶点的数量,而不是其中一个分区的基数。当然,我们不知道OP是否真的对任何给定的解决方案感兴趣,我们如何验证移除的路径数是否超过(路径的p分数)?这本身不是一个困难的问题吗?谢谢,我想这是一个非常直接的算法。但是,你能保证得到答案吗?我的意思是你能证明它返回了