Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 图中的最小破坏成本_Algorithm_Graph_Multiway Tree - Fatal编程技术网

Algorithm 图中的最小破坏成本

Algorithm 图中的最小破坏成本,algorithm,graph,multiway-tree,Algorithm,Graph,Multiway Tree,我们得到了一个图G(V,E),其中有N个节点(编号从0到N-1),并且正是(N-1)双向边 图中的每条边都有一个正代价C(u,v)(边权重) 整个图形使得任何一对节点之间都有一条唯一的路径 我们还得到了一个节点编号列表,其中放置了炸弹 我们的目标是从图形中损坏/删除边缘,这样,在损坏/删除图形中的边缘后,炸弹之间就没有联系了-- 也就是说,破坏后,任何两颗炸弹之间都没有路径 损坏边缘的成本(u,v)=边缘重量(u,v) 因此,我们必须损坏这些边缘,这样总的损坏成本最低 例如: Total Nod

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

图中的每条边都有一个正代价C(u,v)(边权重)

整个图形使得任何一对节点之间都有一条唯一的路径

我们还得到了一个节点编号列表,其中放置了炸弹

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

也就是说,破坏后,任何两颗炸弹之间都没有路径

损坏边缘的成本(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.  

约束:


N(即节点数)我认为改进的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)}


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

我认为以下建议应该有效:

  • 1) 从炸弹开始,在你的例子中,我从:
    0
  • 2) 创建连接所有相邻节点的路径。所以,把所有的关系都放在一起,开始一条与它们相关的道路。在您的示例中,它将启动一个路径:
    0->1
  • 3) 如果你在一条路径上击中另一颗炸弹,你将以最低的代价移除边缘。在本例中,我们没有击中炸弹,因此我们继续执行步骤2
  • 3A)任何道路上都没有炸弹。继续执行步骤2,并使用新的相邻节点扩展路径。在您的情况下,将创建一个新路径:
    1->3
    。并且现有的一个将被扩展:
    0->1->2
  • 3B)在道路上发现炸弹。沿着发现炸弹的路径,以最低的成本移除边缘。在您的示例中,路径
    0->1->2
    包含一个炸弹(2)。因此,我们消除了与成本5的关系。从“todo”中删除路径,并在最后到达的节点(2和3)上继续执行步骤2
最后,您应该准确地遍历每个节点一次。
如果我没有弄错的话,复杂度应该是O(n logn)

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

将树在某个顶点上扎根,然后开始自底向上遍历

从叶子开始。如果没有炸弹,切掉叶子继续前进。 如果有炸弹,你必须在通往这片叶子的路上切一条边。将有关最便宜边缘的信息传播到此页

然后,当您处于“内顶点”时,您有以下可能性: 若顶点中有一个炸弹,下面有一些炸弹,那个么切割到所有炸弹的最便宜路径。 若并没有炸弹,并且下面只有一个炸弹,那个么传播有关最便宜路径的信息。
如果下面有更多的炸弹,就把每一颗都砍掉,除了路径最昂贵的一颗。

这就是树木的多向切割问题。它可以通过一个简单的动态规划在多项式时间内求解。参见Chopra和Rao:“,网络21(1):51-891991年。

有算法的描述

postscript文件的

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

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

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

以下是我的假设:

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

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

删除的每个边必须位于两个红色节点之间的路径上

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

  • 删除白色叶节点(和中的
    Constraints::
    N(ie. Number of Nodes) <= 100,000
    ListSize |L|(ie. Number of Bombs) <= N
    1 <=Edge cost(u,v) <= 1000,000