假设您有一个标准图表,其中每个节点和每个边缘都附加了值。 您希望在最短的时间内从图表上的一个节点转到另一个节点。 到目前为止,遍历此图表所花费的时间将被称为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
如您所见,底部要短得多。 在这样的小尺寸下,它更容易计算,但在城市规模上,您需要使用某种遍历算法。 有没有人知道除了蛮力之外是否有任何解决方案?
答案 0 :(得分:1)
它被称为最短路径搜索问题,可以通过Dijkstra算法在多项式时间内求解。当计算路径的长度时,还应该添加在目标顶点中等待的时间量(目标顶点除外)。因此它仍然是最短路径搜索问题,但权重函数与简单边的权重和略有不同。