座標を持つグリッド上に6つの頂点を持つグラフがあります:
A ( 0,0)
B ( 4,7)
C ( 7,4)
D (10,4)
E (16,2)
F (16,0)
それらの頂点で完全なグラフを生成し、コストを各エッジに割り当てることができます。コストはMAX( ABS( x1 - x2 ), ABS( y1 - y2 ) )
標準エッジの場合で、ワームホールのコストは0です。
これにより、コストが(隣接行列として)与えられます:
A B C D E F
- -- -- -- -- -- --
A - 7 7 10 16 16
B 7 - 0 6 12 12
C 7 0 - 3 9 9
D 10 6 3 - 0 6
E 16 12 9 0 - 2
F 16 12 9 6 2 -
一方向のワープがある場合、グラフ(または隣接行列)にエッジを作成しますが、そのエッジはその方向に進みますが、反対にはなりません。
その後、優先キューでダイクストラのアルゴリズムを使用できます。
A
優先キューから開始し、隣接する各エッジをプッシュします。
形式:(パス:コスト)
queue = [ (A-B : 7), (A-C : 7), (A-D : 10), (A-E : 16), (A-F : 16) ]
アイテムがキューにプッシュされるとき-各頂点の最小コストを追跡し、既存の最小コストよりもコストが低い場合にのみパスをキューにプッシュします。
min-costs = { A: 0, B: 7, C: 7, D: 10, E: 16, F: 16 }
キューから最初のアイテムを削除し、そのコストが最小コストと一致する場合、そのパスと隣接するエッジによって形成されるすべての複合パスを優先キューにプッシュします(複合パスのコストが既存の最小よりも低い場合):
削除: (A-B : 7)
- 試してください
(A-B-A : 14)
-高いコストとして拒否
- 試す
(A-B-C : 7)
-同じ費用で拒否
- 試してください
(A-B-D : 13)
-高いコストとして拒否
- 試してください
(A-B-E : 19)
-高いコストとして拒否
- 試してください
(A-B-F : 19)
-高いコストとして拒否
削除する (A-C : 7)
- 試してください
(A-C-A : 14)
-高いコストとして拒否
- 試す
(A-C-B : 7)
-同じ費用で拒否
- 試す
(A-C-D : 10)
-同じ費用で拒否
- 試す
(A-C-E : 16)
-同じ費用で拒否
- 試す
(A-C-F : 16)
-同じ費用で拒否
削除する (A-D : 10)
- 試してください
(A-D-A : 20)
-高いコストとして拒否
- 試してください
(A-D-B : 16)
-高いコストとして拒否
- 試してください
(A-D-C : 13)
-高いコストとして拒否
- 試してください
(A-D-E : 10)
-キューに挿入
- 試す
(A-D-F : 16)
-同じ費用で拒否
キューは次のようになります。
queue = [ (A-D-E : 10), (A-E : 16), (A-F : 16) ]
min-costs = { A: 0, B: 7, C: 7, D: 10, E: 10, F: 16 }
削除する (A-D-E : 10)
- 試してください
(A-D-E-A : 26)
-高いコストとして拒否
- 試してください
(A-D-E-B : 22)
-高いコストとして拒否
- 試してください
(A-D-E-C : 19)
-高いコストとして拒否
- 試す
(A-D-E-D : 10)
-同じ費用で拒否
- 試してください
(A-D-E-F : 12)
-キューに挿入
次に、キューは次のとおりです。
queue = [ (A-D-E-F : 12), (A-E : 16), (A-F : 16) ]
min-costs = { A: 0, B: 7, C: 7, D: 10, E: 10, F: 12 }
を削除し(A-D-E-F : 12)
、12のコストで宛先ノードに到達したことを確認します。
注:パス(A-B-C-D-E-F)
、(A-C-D-E-F)
および(A-D-E-F)
すべての最小コストは12です。