「現状のまま」のDFSを使用しても、重み付けされていないグラフでは最短経路が見つからないことを理解しています。
しかし、DFSを微調整して、重みのないグラフで最短パスを見つけることができるのはなぜですか?件名に関するすべてのテキストは、単にそれを実行できないと述べています。私は(自分で試したことがなく)納得していません。
DFSが重み付けされていないグラフで最短パスを見つけることを可能にする変更を知っていますか?そうでない場合、アルゴリズムをそれほど難しくしているのは何ですか?
「現状のまま」のDFSを使用しても、重み付けされていないグラフでは最短経路が見つからないことを理解しています。
しかし、DFSを微調整して、重みのないグラフで最短パスを見つけることができるのはなぜですか?件名に関するすべてのテキストは、単にそれを実行できないと述べています。私は(自分で試したことがなく)納得していません。
DFSが重み付けされていないグラフで最短パスを見つけることを可能にする変更を知っていますか?そうでない場合、アルゴリズムをそれほど難しくしているのは何ですか?
回答:
調整する深さ優先検索の唯一の要素は、子が調査される順序です。通常バージョンは、任意の順序、つまり子が格納されている順序で処理されます。
私が思いつく唯一の実行可能な代替案(最短経路に向けて)は、現在のノードからの距離(小さいものから大きいもの)の順に子を見る貪欲なアプローチです。このルールの反例を簡単に作成できます。
[ ソース ]
さて、これは、調査する次の子を選択する戦略が存在しないという証拠ではありません。これにより、DFSが最短パスを見つけます。
Breadth -first-searchは、重み付けされていないグラフで最短パスを見つけるアルゴリズムです。
DFSから、重み付けされていないグラフ上の最短パスを見つけるアルゴリズムに到達するための簡単な調整があります。基本的に、DFSが使用するスタックをキューに置き換えます。ただし、結果のアルゴリズムはDFSと呼ばれなくなりました。代わりに、幅優先検索を実装します。
上記のパラグラフは正しい直観を与えますが、状況を少し単純化しすぎています。単純なスワップが幅優先検索の実装を提供するコードを書くのは簡単ですが、最初は正しい実装のように見えますが実際にはそうではないコードを書くのも簡単です。関連するcs.SEの質問については、BFSとDFSをご覧ください。ここでいくつかの素敵な擬似コードを見つけることができます。
あなたはできる!!!
深さを調べている間にノードを訪問済みとしてマークし、戻るときにマークを解除します。別のブランチが見つかったときに戻って同じことを繰り返します。
ターゲットノードが見つかったすべての可能な検索のコスト/パスを保存し、そのようなコスト/パスをすべて比較して、最短のものを選択します。
このアプローチの大きな(そしてBIGを意味する)問題は、同じノードに複数回アクセスすることになるため、dfsは最短パスアルゴリズムにとって明らかに悪い選択になることです。
BFSには、ルートからすべてのエッジをチェックし、ルートから他のノードまでの距離を可能な限り最小限に抑えるという優れたプロパティがありますが、dfsは単に最初の隣接ノードにジャンプし、深さ方向に移動します。最短パスを取得するためにDFSを変更できますが、最終的には時間の複雑度がより高いアルゴリズムになるか、BFSと同じことを実行することになります
ITは、DFSを使用して最小のエッジ数で2つの頂点間のパスを見つけることができます。レベルのアプローチを適用できます
あなたはできる
dfs方式でグラフをトラバースし、チェックするだけです
if(distance[dest] > distance[source]+cost[source_to_destination]){
distance[dest] = distance[source] + cost[source_to_destination]);
}