各ノードと各エッジに値が付加された標準グラフがあるとします。最短時間でグラフ上の 1 つのノードから別のノードに移動したいと考えています。このグラフをトラバースするのにこれまでにかかった時間は 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
ご覧のとおり、下の方が短くなっています。このような小さなサイズでは計算が簡単ですが、都市のサイズでは、ある種のトラバーサル アルゴリズムを使用する必要があります。ブルートフォース以外に何らかの解決策があるかどうか知っている人はいますか?