web-dev-qa-db-ja.com

ダイクストラのアルゴリズムは、有向グラフと無向グラフのどちらですか?

私はこれをグーグルで検索しようとし続けていますが、私が見つけている結果は混乱を増しています。おそらく両方に使用できるようです?もしそうなら、それはデフォルトでどのように設計されていますか、それをデフォルト以外の方法で動作させるために何を変更する必要がありますか?

編集:参考のために、私は前学期にこのようなリスト(空港)を与えられた問題がありました:

AER,KZN,1.8835
ASF,KZN,1.3005
ASF,MRV,1.1204
CEK,KZN,1.9263
CEK,OVB,1.6733
DME,KZN,1.7892
DME,NBC,2.2319
DME,UUA,2.3786
EGO,KGD,1.4649
EGO,KZN,1.2603
GYD,NBC,2.0755

私はそれが指示されたと言われ、最短経路を見つけるように頼まれました。 Githubで見つけたダイクストラのアルゴリズムに入れました(オープンコンピューターの中間であったため、最初からアルゴリズムを書くのに十分な時間がありませんでした)。リストが指示されることになっていたため、可能なパスすらありませんでした。この修正を行うためにアルゴリズムまたはリストを変更することになっていたかどうかはわかりませんでした。最終的には、返された2番目の最短パスが実際に指示された最短パスであるという事実になりましたが、私はまだ問題が何であるか疑問に思っています。

13
Austin

両方に適用できます。その理由は次のとおりです。

無向グラフは、基本的に有向グラフと同じです- 双方向接続されたノード間の接続(=反対方向の2つの接続)。

したがって、無向グラフで機能させるために何もする必要はありません。すべての特定のノードから到達できるすべてのノードを知る必要があるだけです。 隣接リスト

28
Keiwan

隣接リストから移動するEdgeがある場合、エッジをPriorityQueueに追加するだけなので、ダイクストラのアルゴリズムを有向グラフと無向グラフの両方で使用できます。たとえば、ノードの1つにAからBまでの重みが3のエッジがある場合、Bからのエッジの場合、エッジをAに戻すことはできませんが、AからBに追加できます。

他の答えと同様に、重みと混同しないようにしてください。ダイクストラのアルゴリズムは正の重み付きグラフで実行されます。そうでない場合、優先度キューは役に立ちません。

この例では、ダイクストラのアルゴリズムが機能します。これは、グラフの重みが(正)であり、エッジが有向であるためです。

欠点は、エッジが無向グラフの形で二重に割り当てられていることです。オブジェクトの最初のエッジを解析して、隣接リストのエッジを複製しないように注意する必要があります。

5
MathBunny

Djikstrasアルゴリズムは通常、重み付きグラフ用です。おそらく、幅優先探索(BFS)アルゴリズムと混同している可能性があります。これは、本質的に、重み付けされていないグラフのジクストラです。違い(ジクストラとBFSの間)は、重み付けされたパスを扱う場合、パスコストの調整(ウェイト)と、現在のノードの後に​​アクセスするノードの決定を考慮する必要があります。

4
Luvy

グラフが方向付けられているということは、頂点を接続しているエッジが一方の方向に接続できるが、もう一方の方向には接続できないことを意味します。これは、1つの頂点が別の頂点に隣接することはできますが、他の頂点は最初の頂点に隣接しない場合があることを意味します。

ダイクストラのアルゴリズムのコンテキストでは、グラフが有向か無向かは関係ありません。ダイクストラのアルゴリズムは、単に頂点の隣接する頂点を参照します。グラフを有向から無向に変更する場合に変更する必要があるのは、この隣接リストです。

3
Aaron Wojnowski

はい、ダイクストラは有向グラフと無向グラフの両方で機能しますが、すべてのエッジの重みは+ veである必要があります。いずれかの重みが-veの場合、正しい答えを出すことができない可能性があるためです。ダイクストラでは常に最小のエッジwtを確認する必要があるため、無向グラフで機能します。ソース頂点から

0
Gulshan Kumar