长度最大为k的路径,最大值

时间:2013-11-30 12:00:03

标签: algorithm graph max longest-path

我目前正在研究一个问题,我想尝试找到一个执行以下操作的算法:给定方形网格图G和起始节点S和结束节点E,其中G中的E和S,找到路径P从S到E的最大值和| P | < = k。如果它更容易,可以使G成为DAG。

网格单元格为0或1。

举个例子:

S--o--o--o
|  :  |  |
o--o..o..o
:  |  :  |
o--o--E--o
|  :  |  |
o--o--o--o

S := "Starting State" 
E := "Ending State" 
- := "Edge value is 1" 
. := "Edge value is 0"

解决方案k = 5(从我看到的)

S  o  o  o
|         
o--o  o  o
   |     
o  o--E  o

o  o  o  o

S和E是任意的,所以我不能假设只是向下和向右移动,但我可以将图形转换为DAG,并假设有一些损失达到最优。

边缘值是成本,G是网格图,其中每个节点都连接到其四个邻居。

首先,这个问题在文献中是否已为人所知?我没有发现任何相关信息。它是在NP中还是有人对快速算法有所了解?我问了我选择的搜索引擎,并且有人在StackOverflow上问了一些与之相关的内容,但他们的问题描述与100%不匹配,因为他们的目标是最后一行,其中我的是一个独特的节点。

1 个答案:

答案 0 :(得分:1)

Aight,先警告:我已经想到了这一点。我似乎记得以前读过类似的东西,但我不记得在哪里,所以虽然它似乎是正确的但我不能确定它。如果我稍后发现一个漏洞,我会回来编辑这篇文章并通知你。

L(k,v)是从 S 到某个节点的最长 k 的路径值v ,并假设 v 具有前辈 {u1,u2,... um} 。由于 G 是DAG,因此必须是

L(k, v) = max { L(k-1, u1) + w(u1, v), L(k-1, u2) + w(u2, v), ..., L(k-1, um) + w(um, v) }

其中 w(u,v)是从 u v 的边缘权重。

要使用它,我们要做的是找到长度为的最高值路径< R S R 半径内的每个节点。然后,这给了我们足够的信息来计算长度的最高值路径< R + 1 S 的半径 R + 1 内的每个节点。所以:

  1. 首先,从 S 中丢弃任何距离 k 的节点,因为它不可能是最佳路径的一部分。我们剩下 O(k ^ 2)个节点。
  2. 现在初始化集合L并设置L[S] = 0。保留所有其他条目未定义。
  3. 接下来,将L[v]规则应用于图表中的每个节点(忽略k参数)
    • 如果节点 v 的前任 u 尚未定义L[u]的值,请忽略 u 计算L[v]
    • 如果 v v 已定义L[u],请保留L[v]未定义。
  4. 多次重复步骤3 k-1
  5. 如果L[E]有值,请将其返回。否则,从 S E 的路径不会k
  6. 这是 O(k ^ 3)时间。您可以通过仅考虑 S 的距离1内的节点和 E 的距离 k-1 来加速大型图形的加速执行步骤3,并且在第二次执行期间只有 S 的距离2内的节点和 E 的距离 k-2 ,等等,但那仍然是立方时间。