删除节点

时间:2015-01-04 15:15:32

标签: java algorithm

玩具由n个部分和m绳索组成。每根绳子连接两个部件,但每对部件至少由一根绳子连接。为了拆分玩具,孩子必须拆除所有部件。孩子可以一次移除一个部件,每个部件都消耗能量。让我们将部分i的能量值定义为vi。孩子花费vf1 + vf2 + ... + vfk能量来移除部分i,其中f1,f2,...,fk是直接连接到第i个部分并且没有被移除的部分。 />

解决方案建议:删除所有n个节点的最佳方法是按其值的降序删除它们。

代码:

int n = in.nextInt();
int m = in.nextInt();
int[] w = new int[n]; 
for(int i=0;i<n;i++) {w[i]=in.nextInt();
}

int[] c = new int[n];
int ans =0;
for(int i=0;i<m;i++){
    int xx = in.nextInt();
    int yy = in.nextInt();
   ans+= Math.min(w[--xx],w[--yy]);
}
System.out.println(ans);

}
}

请解释声明删除所有n个节点的最佳方法是按降序删除它们。为什么我们只添加一个节点的代码? Problem LInk

2 个答案:

答案 0 :(得分:2)

以下是其正确性的证明(我将使用术语&#39;顶点&#39;&#39; edge&#39;&#39; pay&#39;而不是&#39;部件&#39 ;,&#39;绳索&#39;以及&#39;在我的证明中花费精力)。

  1. 此解决方案产生的答案不会超过最佳解决方案。让我们来看看一个边缘。其中一个顶点将在另一个顶点后删除。我们必须支付以后删除的那个。这就是为什么每个边缘我们必须至少支付min(cost[v], cost[u])

  2. 最佳答案不大于此算法产生的答案。让我们按照其成本的降序删除顶点。对于每个边缘,更便宜的顶点将是最后删除的顶点。这就是我们为此付出min(cost[v], cost[u])费用的原因。

  3. 因此我们已经证明最佳答案不能大于并且不能小于该算法产生的答案。因此,它是最佳的(a >= b and a <= b暗示a = b)。

答案 1 :(得分:0)

不是正式证据,只是帮助您理解:

为了拆分玩具,必须将每根绳子切断#39;并且每根绳子连接两个部分,以最大限度地减少总能量,您选择从低能量切割绳索&#39;一部分。

如何通过一次删除单个部件来实现此目的?您按降序删除零件(对于每根绳索,您总是消耗更少的能量)。

但要计算最小能量,只需为每根绳索添加更少的能量(这正是代码所做的)。