【问题标题】:Minimum damaging costs in graph图中的最小破坏成本
【发布时间】:2012-06-19 08:46:30
【问题描述】:

我们得到一个图 G(V,E),它有 N 个节点(编号从 0 到 N-1)并且正好是 (N-1)双向边.

图中的每条边都有一个正成本 C(u,v)(边权重)。

整个图是这样的:任何一对节点之间都有唯一的路径

我们还得到了一个节点号列表L,炸弹被放置在该列表中。

我们的目标是损坏/移除图表中的边缘,这样,在损坏/移除图表中的边缘后,炸弹之间就没有联系了 --

伤害后,任意两颗炸弹之间没有路径

破坏边缘的成本(u,v) = 边缘权重(u,v)

所以,我们必须破坏这些边缘,以使总破坏成本最小

例子:

Total Nodes=N=5 
Total Bomb=Size of List L=3

List L={2,4,0}//Thats is at node number 2,4 and 0 bomb is placed...

Total Edges =N-1=4 edges are::

u v Edge-Weight

2 1 8

1 0 5

2 4 5

1 3 4



In this case the answer is ::
Total Damaging cost =(Edge Weight (2,4) + Edge Weight(0,1))
           =5+5=10.

So when we remove the edge connecting node (2,4),
and the edge connecting node (0,1) ,there is no connection left 
between any pair of machines in List {2,4,0};

Note any other,combinations of edges(that  we damaged ) to achieve the
target goal ,needs more than 10 unit cost.  

Constraints::
N(ie. Number of Nodes) <= 100,000
ListSize |L|(ie. Number of Bombs) <= N
1 <=Edge cost(u,v) <= 1000,000

我做了什么?

到目前为止,我还没有找到任何有效的方法:( .

进一步,由于节点的数量是N,边的数量正好是N-1,并且整个图是这样的,在任何一对节点之间都有一条唯一路径,我得出的结论是图是一棵

我尝试修改 Kruskal 算法,但也没有用。

谢谢!

【问题讨论】:

  • 我相信贪婪的方法(删除每条路径中的最低顶点)在树中有机会,但还不确定:\ 另外:你会发现什么是一种有效的方法?
  • @amit,直到现在我还没有找到任何有效的方法来解决这个问题。约束节点数=100,000,这意味着总边数=100,000-1。所以 O(n log n) 算法会很方便和高效。
  • @All:: 将约束添加为编辑。
  • 如果图是全连接的,它是树,否则它可以是普通图。

标签: algorithm graph multiway-tree


【解决方案1】:

我认为修改后的 Kruskal 是最好的选择。

取图 G'=(V', E'), V'=V, E'={}。 以成本的非递增顺序对 E 中的边进行排序。 现在,对于 E 中的每条边,将其添加到 E' 中,当且仅当它不连接两个组件,这两个组件的顶点都带有炸弹。 结果是 E-E' 的成本之和。

编辑:

在你的例子上运行这个。

最初,我们的边集是空的 {},我们取边以非升序排序 [(1, 2), (0, 1), (2, 4), (1, 3)]

因此,一开始,我们的图表由 5 个不连贯的组件组成。

(1, 2) 的成本为 8,它连接的组件中只有一个有炸弹。所以我们将它添加到 E'。 E'={(1, 2)} 我们有 4 个组件。

下一个最高成本边是 (0, 1),成本为 5。但两个组件都有炸弹,所以不要添加这条边。

下一个是 (2, 4)。这也连接到带有炸弹的组件,所以我们也跳过了。

最后,成本最低的边是 (1, 3)。由于其中一个组件(仅包含节点 3)没有炸弹,我们将其添加到 E'。

这给了我们 E' = {(1,2), (1, 3)}。

我的理由是,我们尝试在成本较低的边缘之前添加成本较高的边 - 这可确保在原始节点中存在炸弹的节点之间的任何路径中,除了最低成本之外的所有边都将被添加。

【讨论】:

  • MaK,你能举个例子吗。我不认为这种方法有效,因为总是有一个连接的组件,因为“整个图是这样的,任何一对节点之间都有唯一的路径” .如果我错了请纠正我,我想如果你能说明你的方法,以示例输入为例,那么它会更容易理解。
【解决方案2】:

这是树中的多路切割问题。它可以通过简单的动态规划在多项式时间内求解。参见 Chopra 和 Rao:“On the multiway cut polyhedron”,Networks 21(1):51–89, 1991。

【讨论】:

【解决方案3】:

我认为这可以在线性时间内完成。

以某个顶点为根,然后自底向上遍历。

从一片叶子开始。如果没有炸弹,切掉叶子并继续前进。 如果有炸弹,您必须在通往这片叶子的路径上切割一个边缘。向上传播有关最便宜边缘的信息。

那么当你在内部顶点时,你有这样的可能性: 如果顶点有炸弹,下面有一些炸弹,请切断所有这些炸弹的最便宜路径。 如果没有炸弹并且下面只有一颗炸弹,则传播有关最便宜路径的信息。 如果下方有更多炸弹,则将除最昂贵路径的炸弹之外的所有炸弹都砍掉。

【讨论】:

  • 我也有同样的想法,但无法得出最终的算法,我认为你记住相当于一颗炸弹的子树的想法就可以了。
【解决方案4】:

这是我的假设:

G 是一棵树。因此,任何两个节点之间只有一条路径

假设有 L 红色(炸弹)节点和 V-L 白色(非炸弹节点)。该解决方案需要将 G 划分为 L 个子树的森林。这需要移除至少 L-1 个边。

每个被移除的边缘都必须位于两个红色节点之间的路径上。

A.修剪树 G 以删除所有 不参与两个红色节点之间路径的边。

  1. 从考虑中删除白色叶节点(和入射边)。
  2. 重复 #1 直到修改后的图中没有白色叶节点。

B. 在 (A) 之后,图中剩下的所有边都是形成两个红色节点之间的路径的边。

选择这棵树中权重最小的边。这将产生两棵子树,每棵树至少包含一个红色节点。

C.如果 B 中创建的每个子树包含一个以上的红色节点,则返回步骤 A。

这是 O(V log V) (|E| 是 |V| -1 )。

【讨论】:

    【解决方案5】:

    我认为以下建议应该可行:

    • 1) 从炸弹开始,在你的例子中我从:0
    • 2) 创建包含所有相邻节点的路径。所以,带着所有的关系,和他们一起开始一条路。在您的示例中,它将开始一条路径:0 -&gt; 1
    • 3) 如果你在路径上击中另一个炸弹,你会以最低的成本移除边缘。在示例中,我们没有击中炸弹,因此我们继续第 2 步。
    • 3A) 任何路径中都没有炸弹。继续步骤 2 并使用新的相邻节点扩展路径。在您的情况下,将创建一个新路径:1 -&gt; 3。现有的将被扩展:0 -&gt; 1 -&gt; 2
    • 3B)在路径上发现炸弹。走找到炸弹的路径,去掉成本最低的边。在您的示例中,路径 0 -&gt; 1 -&gt; 2 包含一个炸弹 (2)。因此,我们删除与成本 5 的关系。从“待办事项”中删除路径,并在最后到达的节点(2 和 3)上继续执行步骤 2。

    最后你应该只遍历每个节点一次。 如果我没记错的话,复杂度应该是 O(n log n)

    【讨论】:

      【解决方案6】:

      http://www.cs.ust.hk/mjg_lib/Classes/COMP572_Fall06/Notes/Tree_Multicut.ps

      有算法的描述。

      后记文件的Google HTML version

      ==========================================

      http://dspace.mit.edu/bitstream/handle/1721.1/5394/OR-308-95.pdf?sequence=1

      情况 k = 2 不是多路割问题的唯一多项式可解实例。 Lovdsz [12] 和 Cherkasskij [3] 表明,当 ce = 1 Ve E E 和 G 是欧拉时,多路 割问题是多项式可解的。 Erdos 和 Sz6kely [8] 已经表明, 当底层图 G 是一棵树时,多路切割问题是多项式可解的。 Dalhaus 等。人。 [7] 表明该问题对于平面图上的固定 k 是多项式可解的。

      我昨晚写了一个简单的基于贪心算法的解决方案,其中包括删除不在两个红色(终端)节点之间的路径上的节点,然后选择最小的权重节点,然后在子节点上重复该过程树木。我删除了它,因为进一步阅读表明问题是NP。但是这个参考表明存在多项式解决方案......

      【讨论】:

        猜你喜欢
        • 2013-11-09
        • 1970-01-01
        • 2016-10-14
        • 2018-12-08
        • 1970-01-01
        • 2018-12-24
        • 2013-01-17
        • 2014-10-30
        • 1970-01-01
        相关资源
        最近更新 更多