交通灯图

时间:2014-10-13 20:59:46

标签: algorithm graph-algorithm graph-traversal

假设您有一个标准图表,其中每个节点和每个边缘都附加了值。 您希望在最短的时间内从图表上的一个节点转到另一个节点。 到目前为止,遍历此图表所花费的时间将被称为T. 如果边缘的值为V,则遍历该边缘会将V添加到您花费的时间(T + = V)。 如果某个节点的值为N,则遍历该节点将迫使您等到所花费的时间可被N整除(T + =(N - T%N)%N)。

你可以把它想象成街道和红绿灯。 在街道上行驶需要花费一定的时间才能到达另一端。 驾驶红绿灯需要花费你等待绿灯的时间。

例如,假设你有这张图:

S--6--[1]--2--[7]
       |       |
       3       2
       |       |
      [9]--3--[6]--1--E

乍一看,顶部路径看起来更快,因为它具有较短的边缘和较短的延迟。 然而,底部路线变得更快。让我们先计算底部:

Start: 0 + 6 -> 6
       6 % 1 == 0 # We can pass
       6 + 3 -> 9
       9 % 9 == 0 # We can pass
       9 + 3 -> 12
       12 % 6 == 0 # We can pass
       12 + 1 -> 13
End:   13

然后是顶部:

Start: 0 + 6 -> 6
       6 % 1 == 0 # We can pass
       6 + 2 -> 8
       8 % 7 != 0 # Have to wait
       8 + 6 -> 14
       14 % 7 == 0 # We can pass
       14 + 2 -> 16
       16 % 6 != 0 # Have to wait
       16 + 2 -> 18
       18 % 6 == 0 # We can pass
       18 + 1 -> 19
End:   19

如您所见,底部要短得多。 在这样的小尺寸下,它更容易计算,但在城市规模上,您需要使用某种遍历算法。 有没有人知道除了蛮力之外是否有任何解决方案?

1 个答案:

答案 0 :(得分:1)

它被称为最短路径搜索问题,可以通过Dijkstra算法在多项式时间内求解。当计算路径的长度时,还应该添加在目标顶点中等待的时间量(目标顶点除外)。因此它仍然是最短路径搜索问题,但权重函数与简单边的权重和略有不同。