2 つの構造: セットとリスト。
セットには、すでに訪れたノードを保存します。これにより、サイクルをたどることができなくなります。
このリストは、(1) ノード、および (2) ノードを見つけたノードへのポインタを含むオブジェクトのリストです。
開始ノードから始めて、それをセットに追加し、null 後方参照を使用してリストに追加し、リスト内のインデックス 0 (開始ノード) への後方参照を使用して、到達できるすべてのノードをリストに追加します。 .
その後、リスト内の各要素に対して、最後に到達するまで、次の操作を行います。
- セット内にある場合は、スキップして (既にアクセス済み)、リスト内の次の項目に移動します。
- それ以外の場合は、セットに追加し、リストの最後に「見ている」インデックスへの後方参照を使用して、到達できるすべてのノードをリストに追加します。次に、リスト内の次のインデックスに移動して繰り返します。
任意の時点で終了ノードに到達した場合 (リストにアクセスするのではなく、リストに追加するのが最適です)、開始ノードへの後方参照を追跡し、パスを逆にします。
例:
ノード 0 から 3 を指定すると、
node0 --> node1
node0 --> node2
node1 --> node2
node2 --> node3
で、node0 は START で node3 は END です。
セット = {}
リスト = []
ステップ 1 - START を追加:
SET = {node0}
LIST = [[node0, null]]
ステップ 2 - リストのインデックス 0 で、到達可能なノードを追加します。
SET = {node0, node1, node2}
LIST = [ [node0, null] , [node1, 0], [node2, 0]]
ステップ 3 - LIST のインデックス 1 で、到達可能なノードを追加します。
node2 はすでに SET に含まれています。LIST への到達可能なノードの追加をスキップします。
SET = {node0, node1, node2}
LIST = [[node0, null], [node1, 0] , [node2, 0]]
ステップ 4 - LIST のインデックス 2 で、到達可能なノードを追加します。
SET = {node0, node1, node2, node3}
LIST = [[node0, null], [node1, 0], [node2, 0] , [node3, 2]]
ステップ 5 - END に到達し、バックトラックします。
LIST に挿入された END ノード (node3) には、リスト内のインデックス 2 (node2) への後方参照があります。これには、リスト内のインデックス 0、つまり node0 (START) への後方参照があります。これを逆にすると、node0 --> node2 --> node3 の最短パスが得られます。