在加权DAG中查找特定权重的路径

时间:2016-07-07 14:49:23

标签: algorithm graph

给定DAG,其中边缘具有正边缘权重。给定值N。

计算简单(无循环或节点重复)的路径,总重量为N?

我知道算法,我们必须找到给定路径长度的路径(边缘数),但对于给定路径权重有些混淆?

Dijkstra可以针对此案进行修改吗?还是其他什么?

1 个答案:

答案 0 :(得分:1)

这是NP完全的,所以不要指望任何合理的快速(多项式时间)算法。这是NP-complete Subset Sum problem的减少,我们给出了一个n个整数X = {x_1,x_2,...,x_n}和一个数字k的多集,并询问是否有任何子集n个数字总和恰好是k:

创建一个图形G,其中包含n + 1个顶点v_1,v_2,...,v_ {n + 1}。对于每个顶点v_i,将边添加到每个更高编号的顶点v_j,并给所有这些边加权x_i。该图具有O(n ^ 2)个边,并且可以在O(n ^ 2)时间内构造。显然它没有循环。

假设子集和问题的答案为是:即,存在X的子数Y,使得Y中的数字总计恰好为k。实际上,让Y = {y_1,y_2,...,y_m}由所选元素X的m< = n 索引 1< = i< = n组成。然后在那里是图G中具有完全相同权重的相应路径 - 即从v_ {y_1}开始的路径,将边缘带到v_ {y_2}(权重为x_ {y_1}),然后采用边缘v_ {y_3},等等,最后到达v_ {y_m}并将最后一个边(权重为x_ {y_m})带到终端顶点v_ {n + 1}。

在另一个方向,假设总重量的G中有一条简单的路径正好是k。由于路径很简单,每个顶点最多只出现一次。因此,路径中的每个边缘都留下一个唯一的顶点。对于除最后一个之外的路径中的每个顶点v_i,将x_i添加到一组选定的数字中:这些数字对应于路径中的边权重,因此很明显它们总和为k,这意味着子集和问题的解决方案也是是。 (请注意,路径中最终顶点的位置无关紧要,因为我们只关心它离开的顶点,而离开顶点的所有边都具有相同的权重。)

任何一个问题的答案都表示对另一个问题的答案是肯定的,因此对这两个问题的答案都没有答案意味着对另一个问题没有答案。因此,可以通过首先在多项式时间内构造问题的指定实例,然后使用任何算法解决该实例来找到任何子集求和问题实例的答案 - 所以如果存在可以解决任何实例的算法你的多项式时间问题,NP-hard子集和问题也可以在多项式时间内求解。