logo

ダイクストラのアルゴリズム

次のチュートリアルでは、ダイクストラの最短パス アルゴリズムについて説明します。段階的な図解でダイクストラアルゴリズムの仕組みを理解していきます。

以下について説明します。

  • グラフの基本概念の概要
  • ダイクストラのアルゴリズムの使用を理解する
  • ステップバイステップの例でアルゴリズムの動作を理解する

それでは、始めましょう。

グラフの簡単な紹介

グラフ は、要素間の「接続」を表す非線形データ構造です。これらの要素は、 頂点 、グラフ内の任意の 2 つの頂点を結ぶ線または円弧は、 エッジ 。より正式には、グラフは次のもので構成されます。 頂点のセット (V) そして エッジのセット (E) 。グラフは次のように表されます。 G(V,E)

グラフの構成要素

    頂点:頂点は、現実のオブジェクト、人、またはエンティティを表すために使用されるグラフの基本単位です。頂点はノードとも呼ばれる場合があります。エッジ:エッジは、グラフの 2 つの頂点を接続するために描画または使用されます。エッジは円弧とも呼ばれる場合があります。

次の図は、グラフのグラフィック表現を示しています。

ディクストラ

図1: グラフのグラフィック表現

上の図では、頂点/ノードは色付きの円で示され、エッジはノードを接続する線で示されます。

グラフの応用

グラフは、現実の多くの問題を解決するために使用されます。ネットワークを表すためにグラフが使用されます。これらのネットワークには、都市内の電話網、回線網、または経路が含まれる場合があります。

たとえば、グラフを使用して、頂点が製品を送受信する施設を表示し、エッジがそれらを接続する道路または経路を表す交通ネットワーク モデルを設計できます。以下は同じものを図で表したものです。

ディクストラ

図2: 交通ネットワークの図解

グラフは、LinkedIn、Facebook、Twitter などのさまざまなソーシャル メディア プラットフォームでも利用されます。たとえば、Facebook などのプラットフォームは、グラフを使用してユーザーのデータを保存します。グラフではすべての人が頂点で示され、それぞれが個人 ID、名前、性別、住所などの情報を含む構造になっています。

グラフの種類

グラフは次の 2 つのタイプに分類できます。

  1. 無向グラフ
  2. 有向グラフ

無向グラフ: 方向のないエッジを持つグラフは、無向グラフと呼ばれます。このグラフのエッジは、各エッジを両方向に横断できる双方向の関係を暗示しています。次の図は、4 つのノードと 5 つのエッジを持つ単純な無向グラフを示しています。

ディクストラ

図3: 単純な無向グラフ

有向グラフ: 方向のあるエッジを持つグラフは、有向グラフと呼ばれます。このグラフのエッジは、各エッジが一方向にのみ横断できる一方向の関係を暗示しています。次の図は、4 つのノードと 5 つのエッジを持つ単純な有向グラフを示しています。

ディクストラ

図4: 単純な有向グラフ

グラフの図では、エッジの絶対的な長さ、位置、向きには意味がありません。言い換えれば、グラフの基礎となる構造が変わらなければ、頂点を再配置したりエッジを歪めたりすることで、同じグラフをさまざまな方法で視覚化できます。

加重グラフとは何ですか?

各エッジに「重み」が割り当てられている場合、グラフは重み付けされていると言われます。エッジの重みは、距離、時間、またはエッジが接続する頂点のペア間の「接続」をモデル化するものを表すことができます。

たとえば、次の加重グラフの図では、各エッジの横に青い数字が表示されます。この数値は、対応するエッジの重みを示すために使用されます。

ディクストラ

図5: 重み付けされたグラフの例

ダイクストラのアルゴリズムの概要

グラフの基本的な概念をいくつか理解したので、ダイクストラのアルゴリズムの概念を理解しましょう。

Google マップが 2 つの場所間の最短最速ルートをどのように見つけているのか疑問に思ったことはありませんか?

さて、答えは ダイクストラのアルゴリズムダイクストラのアルゴリズム グラフアルゴリズムです 最短経路を見つけるもの ソース頂点からグラフ内の他のすべての頂点まで (単一ソース最短パス)。これは、正の重みを持つ加重グラフでのみ機能する貪欲アルゴリズムの一種です。ダイクストラアルゴリズムの時間計算量は次のとおりです。 O(V2) グラフの隣接行列表現を利用します。今回の複雑さは次のように削減できます。 O((V + E) log V) グラフの隣接リスト表現を利用して、 は頂点の数であり、 そして グラフ内のエッジの数です。

アンドロイドのバージョン履歴

ダイクストラのアルゴリズムの歴史

ダイクストラのアルゴリズムは、によって設計され、公開されました。 博士。エドガー・W・ダイクストラ 、オランダのコンピュータ科学者、ソフトウェアエンジニア、プログラマー、科学エッセイスト、システム科学者。

2001 年の ACM ジャーナルのコミュニケーションでのフィリップ L. フラナへのインタビューで、エドガー W. ダイクストラ博士は次のように明らかにしました。

「ロッテルダムからフローニンゲンまで、つまり特定の都市から特定の都市へ移動する最短の方法は何ですか? 20分ほどで設計した最短経路のアルゴリズムです。ある朝、私は若い婚約者とアムステルダムで買い物をしていました。疲れていて、カフェのテラスに座ってコーヒーを飲みました。私にこれができるかどうかを考えていました。そして、最短経路のアルゴリズムを設計しました。 。先ほども言いましたが、これは 20 分間の発明でした。実際、この本は3年後の59年に出版されました。この出版物は今でも読むことができ、実際、非常に素晴らしいものです。とても素敵な理由の一つは、鉛筆と紙を使わずにデザインしたことです。後で知ったのですが、紙と鉛筆を使わずにデザインすることの利点の 1 つは、避けられる複雑さをすべて避けることをほぼ強制されることです。最終的に、そのアルゴリズムは私にとって大きな驚きとなり、私の名声の基礎の 1 つとなりました。」

ダイクストラは、1956 年にアムステルダムの数学センターでプログラマーとして働いていたときに、ARMAC として知られる新しいコンピューターの機能を説明するために最短経路問題について考えました。彼の目標は、コンピューターの知識がない人でも理解できる問題と解決策 (コンピューターによって生成される) の両方を選択することでした。彼は最短経路アルゴリズムを開発し、その後、オランダの 64 都市の曖昧に短縮された交通地図用に ARMAC で実行しました (64 都市なので、都市番号をエンコードするには 6 ビットで十分です)。 1 年後、彼は研究所の次のコンピュータを操作するハードウェア エンジニアから別の問題に遭遇しました。それは、マシンの背面パネルのピンを接続するために必要なワイヤの量を最小限に抑えることです。解決策として、彼はプリムの最小スパニング ツリー アルゴリズムと呼ばれるアルゴリズムを再発見し、1959 年に発表しました。

ダイクストラのアルゴリズムの基礎

ダイクストラのアルゴリズムの基本概念は次のとおりです。

  1. ダイクストラのアルゴリズムは、選択したノード (ソース ノード) から始まり、グラフを調べて、そのノードとグラフ内の他のすべてのノードの間の最短パスを見つけます。
  2. このアルゴリズムは、各ノードからソース ノードまでの現在認識されている最短距離の記録を保持し、より短いパスが見つかった場合はこれらの値を更新します。
  3. アルゴリズムがソースと別のノード間の最短パスを取得すると、そのノードは「訪問済み」としてマークされ、パスに含まれます。
  4. この手順は、グラフ内のすべてのノードがパスに含まれるまで続きます。このようにして、各ノードに到達するための最短パスをたどって、ソース ノードを他のすべてのノードに接続するパスが得られます。

ダイクストラのアルゴリズムの仕組みを理解する

グラフ そして ソース頂点 はダイクストラアルゴリズムの要件です。このアルゴリズムは貪欲なアプローチに基づいて確立されているため、アルゴリズムの各ステップで局所的に最適な選択 (この場合は局所最小値) が見つかります。

このアルゴリズムの各頂点には、次の 2 つのプロパティが定義されています。

  1. 訪問物件
  2. パスのプロパティ

これらの性質を簡単に理解しましょう。

訪問した物件:

  1. 「visited」プロパティは、ノードが訪問されたかどうかを示します。
  2. このプロパティを使用して、ノードを再度訪問しないようにします。
  3. 最短パスが見つかった場合にのみ、ノードは訪問済みとしてマークされます。

パスのプロパティ:

  1. 「path」プロパティには、ノードへの現在の最小パスの値が保存されます。
  2. 現在の最小パスは、これまでにこのノードに到達した最短経路を意味します。
  3. このプロパティは、ノードの近隣ノードにアクセスすると変更されます。
  4. このプロパティは、各ノードの最終的な回答を保存するため重要です。

最初に、すべての頂点またはノードがまだ訪問されていないため、未訪問としてマークします。ソース ノードから離れたすべてのノードへのパスも無限に設定されます。また、送信元ノードへのパスはゼロ(0)に設定される。

次に、ソース ノードを選択し、訪問済みとしてマークします。その後、ソース ノードのすべての隣接ノードにアクセスし、すべてのノードで緩和を実行します。緩和は、別のノードの助けを借りて、ノードに到達するコストを下げるプロセスです。

緩和の過程で、各ノードのパスは、ノードの現在のパス、前のノードまでのパスの合計、および前のノードから現在のノードまでのパスのうちの最小値に修正されます。

p[n] がノード n の現在のパスの値、p[m] が以前に訪問したノード m までのパスの値、w が現在のノードとノード間のエッジの重みであると仮定します。以前に訪問したもの (n と m の間のエッジの重み)。

数学的な意味では、リラクゼーションは次のように例示できます。

p[n] = 最小値(p[n], p[m] + w)

次に、後続のすべてのステップで訪問済みのパスが最も少ない未訪問のノードをマークし、その隣接ノードのパスを更新します。

グラフ内のすべてのノードが訪問済みとしてマークされるまで、この手順を繰り返します。

訪問先セットにノードを追加すると、それに応じて隣接するすべてのノードへのパスも変更されます。

いずれかのノードが到達不能なままになっている場合 (コンポーネントが切断されている場合)、そのパスは「無限」のままになります。ソース自体が別個のコンポーネントである場合、他のすべてのノードへのパスは「無限」のままになります。

例を使ってダイクストラのアルゴリズムを理解する

ダイクストラのアルゴリズムを実装するために従う手順は次のとおりです。

ステップ1: まず、ソース ノードに現在の距離 0 をマークし、残りのノードを INFINITY に設定します。

ステップ2: 次に、現在の距離が最小の未訪問のノードを現在のノードとして設定します (X とします)。

ステップ 3: 現在のノード X の近隣 N ごとに、X の現在の距離と X-N を結ぶエッジの重みを加算します。現在の N の距離より小さい場合は、それを新しい現在の N の距離として設定します。

ステップ 4: 次に、現在のノード X を訪問済みとしてマークします。

ステップ5: からのプロセスを繰り返します 'ステップ2' グラフ内に未訪問のノードが残っている場合。

例を使用してアルゴリズムの実装を理解しましょう。

ディクストラ

図6: 与えられたグラフ

  1. 上記のグラフを入力として使用し、ノードを追加します。 ソースとして。
  2. まず、すべてのノードを未訪問としてマークします。
  3. パスを設定します 0 ノードで そして インフィニティ 他のすべてのノードの場合。
  4. 次にソースノードをマークします 訪問したときにその隣接ノードにアクセスします。
    注記: 隣接するノードにアクセスしただけであり、それらを訪問したわけではありません。
  5. ノードへのパスを更新します B による 4 ノードへのパスがあるため、リラクゼーションの助けを借りて 0 ノードからのパス B4 、 そしてその 最小((0 + 4), INFINITY)4
  6. ノードへのパスも更新します C による 5 ノードへのパスがあるため、リラクゼーションの助けを借りて 0 ノードからのパス C5 、 そしてその 最小((0 + 5), INFINITY)5 。ノードの両方の隣接ノード 今はリラックスしています。したがって、先に進むことができます。
  7. ここで、パスが最小の次の未訪問ノードを選択し、そこにアクセスします。したがって、ノードにアクセスします B そして、まだ訪れていない隣人に対してリラクゼーションを実行します。リラクゼーション実行後のノードへのパス C 残ります 5 、ノードへのパス そして となります 十一 、およびノー​​ドへのパス D となります 13
  8. 次にノードを訪問します そして そして隣接するノードで緩和を実行します B、D 、 そして F 。ノードだけなので F 訪問者がいないので、リラックスできます。したがって、ノードへのパスは B そのままになります、つまり、 4 、ノードへのパス D も残ります 13 、およびノー​​ドへのパス F となります 14 (8 + 6)
  9. 次にノードを訪問します D 、およびノー​​ドのみ F リラックスするでしょう。ただし、ノードへのパスは F 変更されないままになります。つまり、 14
  10. ノードだけなので F が残っている場合は、そこを訪問しますが、すべての隣接ノードがすでに訪問されているため、緩和は実行されません。
  11. グラフのすべてのノードにアクセスすると、プログラムは終了します。

したがって、私たちが結論付けた最終的なパスは次のとおりです。

配列javaに追加する
 A = 0 B = 4 (A -> B) C = 5 (A -> C) D = 4 + 9 = 13 (A -> B -> D) E = 5 + 3 = 8 (A -> C -> E) F = 5 + 3 + 6 = 14 (A -> C -> E -> F) 

ダイクストラアルゴリズムの擬似コード

ここで、ダイクストラのアルゴリズムの疑似コードを理解します。

C++での継承
  • すべてのノードのパス距離の記録を維持する必要があります。したがって、各ノードのパス距離をサイズ n の配列に格納できます。ここで、n はノードの総数です。
  • さらに、最短パスとそのパスの長さを取得したいと考えています。この問題を解決するには、各ノードをそのパス長を最後に更新したノードにマップします。
  • アルゴリズムが完了したら、宛先ノードをソースノードまでバックトラックしてパスを取得できます。
  • 最小優先度キューを使用して、パス距離が最小のノードを効率的な方法で取得できます。

上の図の疑似コードを実装してみましょう。

疑似コード:

 function Dijkstra_Algorithm(Graph, source_node) // iterating through the nodes in Graph and set their distances to INFINITY for each node N in Graph: distance[N] = INFINITY previous[N] = NULL If N != source_node, add N to Priority Queue G // setting the distance of the source node of the Graph to 0 distance[source_node] = 0 // iterating until the Priority Queue G is not empty while G is NOT empty: // selecting a node Q having the least distance and marking it as visited Q = node in G with the least distance[] mark Q visited // iterating through the unvisited neighboring nodes of the node Q and performing relaxation accordingly for each unvisited neighbor node N of Q: temporary_distance = distance[Q] + distance_between(Q, N) // if the temporary distance is less than the given distance of the path to the Node, updating the resultant distance with the minimum value if temporary_distance <distance[n] distance[n] :="temporary_distance" previous[n] returning the final list of distance return distance[], previous[] < pre> <p> <strong>Explanation:</strong> </p> <p>In the above pseudocode, we have defined a function that accepts multiple parameters - the Graph consisting of the nodes and the source node. Inside this function, we have iterated through each node in the Graph, set their initial distance to <strong>INFINITY</strong> , and set the previous node value to <strong>NULL</strong> . We have also checked whether any selected node is not a source node and added the same into the Priority Queue. Moreover, we have set the distance of the source node to <strong>0</strong> . We then iterated through the nodes in the priority queue, selected the node with the least distance, and marked it as visited. We then iterated through the unvisited neighboring nodes of the selected node and performed relaxation accordingly. At last, we have compared both the distances (original and temporary distance) between the source node and the destination node, updated the resultant distance with the minimum value and previous node information, and returned the final list of distances with their previous node information.</p> <h2>Implementation of Dijkstra&apos;s Algorithm in Different Programming Languages</h2> <p>Now that we have successfully understood the pseudocode of Dijkstra&apos;s Algorithm, it is time to see its implementation in different programming languages like C, C++, Java, and Python.</p> <h3>Code for Dijkstra&apos;s Algorithm in C</h3> <p>The following is the implementation of Dijkstra&apos;s Algorithm in the C Programming Language:</p> <p> <strong>File: DijkstraAlgorithm.c</strong> </p> <pre> // Implementation of Dijkstra&apos;s Algorithm in C // importing the standard I/O header file #include // defining some constants #define INF 9999 #define MAX 10 // prototyping of the function void DijkstraAlgorithm(int Graph[MAX][MAX], int size, int start); // defining the function for Dijkstra&apos;s Algorithm void DijkstraAlgorithm(int Graph[MAX][MAX], int size, int start) { int cost[MAX][MAX], distance[MAX], previous[MAX]; int visited_nodes[MAX], counter, minimum_distance, next_node, i, j; // creating cost matrix for (i = 0; i <size; i++) for (j="0;" j < size; j++) if (graph[i][j]="=" 0) cost[i][j]="INF;" else (i="0;" i { distance[i]="cost[start][i];" previous[i]="start;" visited_nodes[i]="0;" } distance[start]="0;" visited_nodes[start]="1;" counter="1;" while (counter size - 1) minimum_distance="INF;" (distance[i] && !visited_nodes[i]) next_node="i;" visited_nodes[next_node]="1;" (!visited_nodes[i]) (minimum_distance + cost[next_node][i] distance[i]) cost[next_node][i]; counter++; printing the distance !="start)" printf('
distance from source node to %d: %d', i, distance[i]); main function int main() defining variables graph[max][max], j, size, source; declaring of matrix nodes graph graph[0][0]="0;" graph[0][1]="4;" graph[0][2]="0;" graph[0][3]="0;" graph[0][4]="0;" graph[0][5]="8;" graph[0][6]="0;" graph[1][0]="4;" graph[1][1]="0;" graph[1][2]="8;" graph[1][3]="0;" graph[1][4]="0;" graph[1][5]="11;" graph[1][6]="0;" graph[2][0]="0;" graph[2][1]="8;" graph[2][2]="0;" graph[2][3]="7;" graph[2][4]="0;" graph[2][5]="4;" graph[2][6]="0;" graph[3][0]="0;" graph[3][1]="0;" graph[3][2]="7;" graph[3][3]="0;" graph[3][4]="9;" graph[3][5]="14;" graph[3][6]="0;" graph[4][0]="0;" graph[4][1]="0;" graph[4][2]="0;" graph[4][3]="9;" graph[4][4]="0;" graph[4][5]="10;" graph[4][6]="2;" graph[5][0]="0;" graph[5][1]="0;" graph[5][2]="4;" graph[5][3]="14;" graph[5][4]="10;" graph[5][5]="0;" graph[5][6]="2;" graph[6][0]="0;" graph[6][1]="0;" graph[6][2]="0;" graph[6][3]="0;" graph[6][4]="2;" graph[6][5]="0;" graph[6][6]="1;" calling dijkstraalgorithm() by passing graph, number and dijkstraalgorithm(graph, source); return 0; pre> <p> <strong>Output</strong> </p> <pre> Distance from the Source Node to 1: 4 Distance from the Source Node to 2: 12 Distance from the Source Node to 3: 19 Distance from the Source Node to 4: 12 Distance from the Source Node to 5: 8 Distance from the Source Node to 6: 10 </pre> <p> <strong>Explanation:</strong> </p> <p>In the above snippet of code, we have included the <strong>stdio.h</strong> header file defined two constant values: <strong>INF = 9999</strong> and <strong>MAX = 10</strong> . We have declared the prototyping of the function and then defined the function for Dijkstra&apos;s Algorithm as <strong>DijkstraAlgorithm</strong> that accepts three arguments - the Graph consisting of the nodes, the number of nodes in the Graph, and the source node. Inside this function, we have defined some data structures such as a 2D matrix that will work as the Priority Queue for the algorithm, an array to main the distance between the nodes, an array to maintain the record of previous nodes, an array to store the visited nodes information, and some integer variables to store minimum distance value, counter, next node value and more. We then used a <strong>nested for-loop</strong> to iterate through the nodes of the Graph and add them to the priority queue accordingly. We have again used the <strong>for-loop</strong> to iterate through the elements in the priority queue starting from the source node and update their distances. Outside the loop, we have set the distance of the source node as <strong>0</strong> and marked it as visited in the <strong>visited_nodes[]</strong> array. We then set the counter value as one and used the <strong>while</strong> loop iterating through the number of nodes. Inside this loop, we have set the value of <strong>minimum_distance</strong> as <strong>INF</strong> and used the <strong>for-loop</strong> to update the value of the <strong>minimum_distance</strong> variable with the minimum value from a <strong>distance[]</strong> array. We then iterated through the unvisited neighboring nodes of the selected node using the <strong>for-loop</strong> and performed relaxation. We then printed the resulting data of the distances calculated using Dijkstra&apos;s Algorithm.</p> <p>In the <strong>main</strong> function, we have defined and declared the variables representing the Graph, the number of nodes, and the source node. At last, we have called the <strong>DijkstraAlgorithm()</strong> function by passing the required parameters.</p> <p>As a result, the required shortest possible paths for every node from the source node are printed for the users.</p> <h3>Code for Dijkstra&apos;s Algorithm in C++</h3> <p>The following is the implementation of Dijkstra&apos;s Algorithm in the C++ Programming Language:</p> <p> <strong>File: DijkstraAlgorithm.cpp</strong> </p> <pre> // Implementation of Dijkstra&apos;s Algorithm in C++ // importing the required header files #include #include // defining constant #define MAX_INT 10000000 // using the standard namespace using namespace std; // prototyping of the DijkstraAlgorithm() function void DijkstraAlgorithm(); // main function int main() { DijkstraAlgorithm(); return 0; } // declaring the classes class Vertex; class Edge; // prototyping the functions void Dijkstra(); vector* Adjacent_Remaining_Nodes(Vertex* vertex); Vertex* Extract_Smallest(vector&amp; vertices); int Distance(Vertex* vertexOne, Vertex* vertexTwo); bool Contains(vector&amp; vertices, Vertex* vertex); void Print_Shortest_Route_To(Vertex* des); // instantiating the classes vector vertices; vector edges; // defining the class for the vertices of the graph class Vertex { public: Vertex(char id) : id(id), prev(NULL), distance_from_start(MAX_INT) { vertices.push_back(this); } public: char id; Vertex* prev; int distance_from_start; }; // defining the class for the edges of the graph class Edge { public: Edge(Vertex* vertexOne, Vertex* vertexTwo, int distance) : vertexOne(vertexOne), vertexTwo(vertexTwo), distance(distance) { edges.push_back(this); } bool Connects(Vertex* vertexOne, Vertex* vertexTwo) public: Vertex* vertexOne; Vertex* vertexTwo; int distance; }; // defining the function to collect the details of the graph void DijkstraAlgorithm() { // declaring some vertices Vertex* vertex_a = new Vertex(&apos;A&apos;); Vertex* vertex_b = new Vertex(&apos;B&apos;); Vertex* vertex_c = new Vertex(&apos;C&apos;); Vertex* vertex_d = new Vertex(&apos;D&apos;); Vertex* vertex_e = new Vertex(&apos;E&apos;); Vertex* vertex_f = new Vertex(&apos;F&apos;); Vertex* vertex_g = new Vertex(&apos;G&apos;); // declaring some edges Edge* edge_1 = new Edge(vertex_a, vertex_c, 1); Edge* edge_2 = new Edge(vertex_a, vertex_d, 2); Edge* edge_3 = new Edge(vertex_b, vertex_c, 2); Edge* edge_4 = new Edge(vertex_c, vertex_d, 1); Edge* edge_5 = new Edge(vertex_b, vertex_f, 3); Edge* edge_6 = new Edge(vertex_c, vertex_e, 3); Edge* edge_7 = new Edge(vertex_e, vertex_f, 2); Edge* edge_8 = new Edge(vertex_d, vertex_g, 1); Edge* edge_9 = new Edge(vertex_g, vertex_f, 1); vertex_a -&gt; distance_from_start = 0; // setting a start vertex // calling the Dijkstra() function to find the shortest route possible Dijkstra(); // calling the Print_Shortest_Route_To() function to print the shortest route from the source vertex to the destination vertex Print_Shortest_Route_To(vertex_f); } // defining the function for Dijkstra&apos;s Algorithm void Dijkstra() { while (vertices.size() &gt; 0) { Vertex* smallest = Extract_Smallest(vertices); vector* adjacent_nodes = Adjacent_Remaining_Nodes(smallest); const int size = adjacent_nodes -&gt; size(); for (int i = 0; i at(i); int distance = Distance(smallest, adjacent) + smallest -&gt; distance_from_start; if (distance distance_from_start) { adjacent -&gt; distance_from_start = distance; adjacent -&gt; prev = smallest; } } delete adjacent_nodes; } } // defining the function to find the vertex with the shortest distance, removing it, and returning it Vertex* Extract_Smallest(vector&amp; vertices) { int size = vertices.size(); if (size == 0) return NULL; int smallest_position = 0; Vertex* smallest = vertices.at(0); for (int i = 1; i distance_from_start distance_from_start) { smallest = current; smallest_position = i; } } vertices.erase(vertices.begin() + smallest_position); return smallest; } // defining the function to return all vertices adjacent to &apos;vertex&apos; which are still in the &apos;vertices&apos; collection. vector* Adjacent_Remaining_Nodes(Vertex* vertex) { vector* adjacent_nodes = new vector(); const int size = edges.size(); for (int i = 0; i vertexOne == vertex) { adjacent = edge -&gt; vertexTwo; } else if (edge -&gt; vertexTwo == vertex) { adjacent = edge -&gt; vertexOne; } if (adjacent &amp;&amp; Contains(vertices, adjacent)) { adjacent_nodes -&gt; push_back(adjacent); } } return adjacent_nodes; } // defining the function to return distance between two connected vertices int Distance(Vertex* vertexOne, Vertex* vertexTwo) { const int size = edges.size(); for (int i = 0; i Connects(vertexOne, vertexTwo)) { return edge -&gt; distance; } } return -1; // should never happen } // defining the function to check if the &apos;vertices&apos; vector contains &apos;vertex&apos; bool Contains(vector&amp; vertices, Vertex* vertex) { const int size = vertices.size(); for (int i = 0; i <size; ++i) { if (vertex="=" vertices.at(i)) return true; } false; defining the function to print shortest route destination void print_shortest_route_to(vertex* des) vertex* prev="des;" cout << 'distance from start: ' < distance_from_start endl; while (prev) id prev; pre> <p> <strong>Output</strong> </p> <pre> Distance from start: 4 F G D A </pre> <p> <strong>Explanation:</strong> </p> <p>In the above code snippet, we included the <strong>&apos;iostream&apos;</strong> and <strong>&apos;vector&apos;</strong> header files and defined a constant value as <strong>MAX_INT = 10000000</strong> . We then used the standard namespace and prototyped the <strong>DijkstraAlgorithm()</strong> function. We then defined the main function of the program within, which we have called the <strong>DijkstraAlgorithm()</strong> function. After that, we declared some classes to create vertices and edges. We have also prototyped more functions to find the shortest possible path from the source vertex to the destination vertex and instantiated the Vertex and Edge classes. We then defined both classes to create the vertices and edges of the graph. We have then defined the <strong>DijkstraAlgorithm()</strong> function to create a graph and perform different operations. Inside this function, we have declared some vertices and edges. We then set the source vertex of the graph and called the <strong>Dijkstra()</strong> function to find the shortest possible distance and <strong>Print_Shortest_Route_To()</strong> function to print the shortest distance from the source vertex to vertex <strong>&apos;F&apos;</strong> . We have then defined the <strong>Dijkstra()</strong> function to calculate the shortest possible distances of the all the vertices from the source vertex. We have also defined some more functions to find the vertex with the shortest distance to return all the vertices adjacent to the remaining vertex, to return the distance between two connected vertices, to check if the selected vertex exists in the graph, and to print the shortest possible path from the source vertex to the destination vertex.</p> <p>As a result, the required shortest path for the vertex <strong>&apos;F&apos;</strong> from the source node is printed for the users.</p> <h3>Code for Dijkstra&apos;s Algorithm in Java</h3> <p>The following is the implementation of Dijkstra&apos;s Algorithm in the Java Programming Language:</p> <p> <strong>File: DijkstraAlgorithm.java</strong> </p> <pre> // Implementation of Dijkstra&apos;s Algorithm in Java // defining the public class for Dijkstra&apos;s Algorithm public class DijkstraAlgorithm { // defining the method to implement Dijkstra&apos;s Algorithm public void dijkstraAlgorithm(int[][] graph, int source) { // number of nodes int nodes = graph.length; boolean[] visited_vertex = new boolean[nodes]; int[] dist = new int[nodes]; for (int i = 0; i <nodes; 0 1 i++) { visited_vertex[i]="false;" dist[i]="Integer.MAX_VALUE;" } distance of self loop is zero dist[source]="0;" for (int i="0;" < nodes; updating the between neighboring vertex and source int u="find_min_distance(dist," visited_vertex); visited_vertex[u]="true;" distances all vertices v="0;" v++) if (!visited_vertex[v] && graph[u][v] !="0" (dist[u] + dist[v])) dist[v]="dist[u]" graph[u][v]; dist.length; system.out.println(string.format('distance from %s to %s', source, i, dist[i])); defining method find minimum private static find_min_distance(int[] dist, boolean[] visited_vertex) minimum_distance="Integer.MAX_VALUE;" minimum_distance_vertex="-1;" (!visited_vertex[i] minimum_distance) return minimum_distance_vertex; main function public void main(string[] args) declaring nodes graphs graph[][]="new" int[][] 0, 1, 2, }, 3, }; instantiating dijkstraalgorithm() class dijkstraalgorithm test="new" dijkstraalgorithm(); calling shortest node destination test.dijkstraalgorithm(graph, 0); pre> <p> <strong>Output</strong> </p> <pre> Distance from Vertex 0 to Vertex 0 is 0 Distance from Vertex 0 to Vertex 1 is 1 Distance from Vertex 0 to Vertex 2 is 1 Distance from Vertex 0 to Vertex 3 is 2 Distance from Vertex 0 to Vertex 4 is 4 Distance from Vertex 0 to Vertex 5 is 4 Distance from Vertex 0 to Vertex 6 is 3 </pre> <p> <strong>Explanation:</strong> </p> <p>In the above snippet of code, we have defined a public class as <strong>DijkstraAlgorithm()</strong> . Inside this class, we have defined a public method as <strong>dijkstraAlgorithm()</strong> to find the shortest distance from the source vertex to the destination vertex. Inside this method, we have defined a variable to store the number of nodes. We have then defined a Boolean array to store the information regarding the visited vertices and an integer array to store their respective distances. Initially, we declared the values in both the arrays as <strong>False</strong> and <strong>MAX_VALUE</strong> , respectively. We have also set the distance of the source vertex as zero and used the <strong>for-loop</strong> to update the distance between the source vertex and destination vertices with the minimum distance. We have then updated the distances of the neighboring vertices of the selected vertex by performing relaxation and printed the shortest distances for every vertex. We have then defined a method to find the minimum distance from the source vertex to the destination vertex. We then defined the main function where we declared the vertices of the graph and instantiated the <strong>DijkstraAlgorithm()</strong> class. Finally, we have called the <strong>dijkstraAlgorithm()</strong> method to find the shortest distance between the source vertex and the destination vertices.</p> <p>As a result, the required shortest possible paths for every node from the source node are printed for the users.</p> <h3>Code for Dijkstra&apos;s Algorithm in Python</h3> <p>The following is the implementation of Dijkstra&apos;s Algorithm in the Python Programming Language:</p> <p> <strong>File: DikstraAlgorithm.py</strong> </p> <pre> # Implementation of Dijkstra&apos;s Algorithm in Python # importing the sys module import sys # declaring the list of nodes for the graph nodes = [ [0, 0, 1, 0, 1, 0, 0], [0, 0, 1, 0, 0, 1, 0], [1, 1, 0, 1, 1, 0, 0], [1, 0, 1, 0, 0, 0, 1], [0, 0, 1, 0, 0, 1, 0], [0, 1, 0, 0, 1, 0, 1], [0, 0, 0, 1, 0, 1, 0] ] # declaring the list of edges for the graph edges = [ [0, 0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 3, 0], [1, 2, 0, 1, 3, 0, 0], [2, 0, 1, 0, 0, 0, 1], [0, 0, 3, 0, 0, 2, 0], [0, 3, 0, 0, 2, 0, 1], [0, 0, 0, 1, 0, 1, 0] ] # defining the function to find which node is to be visited next def toBeVisited(): global visitedAndDistance v = -10 for index in range(numberOfNodes): if visitedAndDistance[index][0] == 0 and (v <0 1 or visitedanddistance[index][1] <="visitedAndDistance[v][1]):" v="index" return # finding the number of nodes in graph numberofnodes="len(nodes[0])" visitedanddistance="[[0," 0]] for i range(numberofnodes - 1): visitedanddistance.append([0, sys.maxsize]) node range(numberofnodes): next to be visited tovisit="toBeVisited()" neighborindex updating new distances if nodes[tovisit][neighborindex]="=" and visitedanddistance[neighborindex][0]="=" 0: newdistance="visitedAndDistance[toVisit][1]" + edges[tovisit][neighborindex] visitedanddistance[neighborindex][1]> newDistance: visitedAndDistance[neighborIndex][1] = newDistance visitedAndDistance[toVisit][0] = 1 i = 0 # printing the distance for distance in visitedAndDistance: print(&apos;Distance of&apos;, chr(ord(&apos;A&apos;) + i), &apos;from source node:&apos;, distance[1]) i = i + 1 </0></pre> <p> <strong>Output</strong> </p> <pre> Distance of A from source node: 0 Distance of B from source node: 3 Distance of C from source node: 1 Distance of D from source node: 2 Distance of E from source node: 2 Distance of F from source node: 4 Distance of G from source node: 3 </pre> <p> <strong>Explanation:</strong> </p> <p>In the above snippet of code, we have imported the <strong>sys</strong> module and declared the lists consisting of the values for the nodes and edges. We have then defined a function as <strong>toBeVisited()</strong> to find which node will be visited next. We then found the total number of nodes in the graph and set the initial distances for every node. We have then calculated the minimum distance from the source node to the destination node, performed relaxation on neighboring nodes, and updated the distances in the list. We then printed those distances from the list for the users.</p> <p>As a result, the required shortest possible paths for every node from the source node are printed for the users.</p> <h2>Time and Space Complexity of Dijkstra&apos;s Algorithm</h2> <ul> <li>The Time Complexity of Dijkstra&apos;s Algorithm is <strong>O(E log V)</strong> , where E is the number of edges and V is the number of vertices.</li> <li>The Space Complexity of Dijkstra&apos;s Algorithm is O(V), where V is the number of vertices.</li> </ul> <h2>Advantages and Disadvantages of Dijkstra&apos;s Algorithm</h2> <p> <strong>Let us discuss some advantages of Dijkstra&apos;s Algorithm:</strong> </p> <ol class="points"> <li>One primary advantage of using Dijkstra&apos;s Algorithm is that it has an almost linear time and space complexity.</li> <li>We can use this algorithm to calculate the shortest path from a single vertex to all other vertices and a single source vertex to a single destination vertex by stopping the algorithm once we get the shortest distance for the destination vertex.</li> <li>This algorithm only works for directed weighted graphs, and all the edges of this graph should be non-negative.</li> </ol> <p> <strong>Despite having multiple advantages, Dijkstra&apos;s algorithm has some disadvantages also, such as:</strong> </p> <ol class="points"> <li>Dijkstra&apos;s Algorithm performs a concealed exploration that utilizes a lot of time during the process.</li> <li>This algorithm is impotent to handle negative edges.</li> <li>Since this algorithm heads to the acyclic graph, it cannot calculate the exact shortest path.</li> <li>It also requires maintenance to keep a record of vertices that have been visited.</li> </ol> <h2>Some Applications of Dijkstra&apos;s Algorithm</h2> <p> <strong>Dijkstra&apos;s Algorithm has various real-world applications, some of which are stated below:</strong> </p> <ol class="points"> <tr><td>Digital Mapping Services in Google Maps:</td> There are various times when we have tried to find the distance in Google Maps either from our location to the nearest preferred location or from one city to another, which comprises multiple routes/paths connecting them; however, the application must display the minimum distance. This is only possible because Dijkstra&apos;s algorithm helps the application find the shortest between two given locations along the path. Let us consider the USA as a graph wherein the cities/places are represented as vertices, and the routes between two cities/places are represented as edges. Then with the help of Dijkstra&apos;s Algorithm, we can calculate the shortest routes between any two cities/places. </tr><tr><td>Social Networking Applications:</td> In many applications like Facebook, Twitter, Instagram, and more, many of us might have observed that these apps suggest the list of friends that a specific user may know. How do many social media companies implement this type of feature in an efficient and effective way, specifically when the system has over a billion users? The answer to this question is Dijkstra&apos;s Algorithm. The standard Dijkstra&apos;s Algorithm is generally used to estimate the shortest distance between the users measured through the connections or mutuality among them. When social networking is very small, it uses the standard Dijkstra&apos;s Algorithm in addition to some other features in order to determine the shortest paths. However, when the graph is much bigger, the standard algorithm takes several seconds to count, and thus, some advanced algorithms are used as the alternative. </tr><tr><td>Telephone Network:</td> As some of us might know, in a telephone network, each transmission line has a bandwidth, &apos;b&apos;. The bandwidth is the highest frequency that the transmission line can support. In general, if the frequency of the signal is higher in a specific line, the signal is reduced by that line. Bandwidth represents the amount of information that can be transmitted by the line. Let us consider a city a graph wherein the switching stations are represented using the vertices, the transmission lines are represented as the edges, and the bandwidth, &apos;b&apos;, is represented using the weight of the edges. Thus, as we can observe, the telephone network can also fall into the category of the shortest distance problem and can be solved using Dijkstra&apos;s Algorithm. </tr><tr><td>Flight Program:</td> Suppose that a person requires software to prepare an agenda of flights for customers. The agent has access to a database with all flights and airports. In addition to the flight number, origin airport, and destination, the flights also have departure and arrival times. So, in order to determine the earliest arrival time for the selected destination from the original airport and given start time, the agents make use of Dijkstra&apos;s Algorithm. </tr><tr><td>IP routing to find Open Shortest Path First:</td> Open Shortest Path First (abbreviated as OSPF) is a link-state routing protocol used to find the best path between the source and destination router with the help of its own Shortest Path First. Dijkstra&apos;s Algorithm is extensively utilized in the routing protocols required by the routers in order to update their forwarding table. The algorithm gives the shortest cost path from the source router to the other routers present in the network. </tr><tr><td>Robotic Path:</td> These days, drones and robots have come into existence, some operated manually and some automatically. The drones and robots which are operated automatically and used to deliver the packages to a given location or used for any certain task are configured with Dijkstra&apos;s Algorithm module so that whenever the source and destination are known, the drone and robot will move in the ordered direction by following the shortest path keeping the time taken to a minimum in order to deliver the packages. </tr><tr><td>Designate the File Server:</td> Dijkstra&apos;s Algorithm is also used to designate a file server in a Local Area Network (LAN). Suppose that an infinite period of time is needed for the transmission of the files from one computer to another. So, to minimize the number of &apos;hops&apos; from the file server to every other computer on the network, we will use Dijkstra&apos;s Algorithm. This algorithm will return the shortest path between the networks resulting in the minimum number of hops. </tr></ol> <h2>The Conclusion</h2> <ul> <li>In the above tutorial, firstly, we have understood the basic concepts of Graph along with its types and applications.</li> <li>We then learned about Dijkstra&apos;s Algorithm and its history.</li> <li>We have also understood the fundamental working of Dijkstra&apos;s Algorithm with the help of an example.</li> <li>After that, we studied how to write code for Dijkstra&apos;s Algorithm with the help of Pseudocode.</li> <li>We observed its implementation in programming languages like C, C++, Java, and Python with proper outputs and explanations.</li> <li>We have also understood the Time and Space Complexity of Dijkstra&apos;s Algorithm.</li> <li>Finally, we have discussed the advantages and disadvantages of Dijkstra&apos;s algorithm and some of its real-life applications.</li> </ul> <hr></nodes;></pre></size;></pre></size;></pre></distance[n]>

説明:

上記のコード スニペットには、 stdio.h ヘッダー ファイルでは 2 つの定数値が定義されています。 INF = 9999 そして 最大 = 10 。関数のプロトタイピングを宣言し、ダイクストラアルゴリズムの関数を次のように定義しました。 ダイクストラアルゴリズム これは 3 つの引数 (ノードで構成されるグラフ、グラフ内のノードの数、およびソース ノード) を受け取ります。この関数内では、アルゴリズムの優先キューとして機能する 2D マトリックス、ノード間の距離を維持する配列、前のノードの記録を維持する配列、保存する配列など、いくつかのデータ構造を定義しました。訪問ノード情報、および最小距離値、カウンタ、次のノード値などを保存するためのいくつかの整変数。次に、 入れ子になった for ループ グラフのノードを反復処理し、それに応じて優先キューにノードを追加します。またまた利用させていただきました forループ ソースノードから開始して優先キュー内の要素を反復処理し、それらの距離を更新します。ループの外側では、ソース ノードの距離を次のように設定しました。 0 そして、それを訪問済みとしてマークしました 訪問ノード[] 配列。次に、カウンター値を 1 に設定し、 その間 ノードの数だけループを繰り返します。このループ内で、次の値を設定しました。 最小距離 として INF そして使用しました forループ の値を更新するには、 最小距離 からの最小値を持つ変数 距離[] 配列。次に、選択したノードの未訪問の隣接ノードを反復処理しました。 forループ そしてリラクゼーションを行いました。次に、ダイクストラのアルゴリズムを使用して計算された距離の結果データを印刷しました。

の中に 主要 関数では、グラフ、ノード数、およびソース ノードを表す変数を定義および宣言しました。ついに、私たちは、 ダイクストラアルゴリズム() 必要なパラメータを渡すことで関数を実行します。

その結果、ソース ノードからすべてのノードに必要な最短パスがユーザーに表示されます。

C++ でのダイクストラのアルゴリズムのコード

以下は、C++ プログラミング言語でのダイクストラのアルゴリズムの実装です。

ファイル: DijkstraAlgorithm.cpp

 // Implementation of Dijkstra&apos;s Algorithm in C++ // importing the required header files #include #include // defining constant #define MAX_INT 10000000 // using the standard namespace using namespace std; // prototyping of the DijkstraAlgorithm() function void DijkstraAlgorithm(); // main function int main() { DijkstraAlgorithm(); return 0; } // declaring the classes class Vertex; class Edge; // prototyping the functions void Dijkstra(); vector* Adjacent_Remaining_Nodes(Vertex* vertex); Vertex* Extract_Smallest(vector&amp; vertices); int Distance(Vertex* vertexOne, Vertex* vertexTwo); bool Contains(vector&amp; vertices, Vertex* vertex); void Print_Shortest_Route_To(Vertex* des); // instantiating the classes vector vertices; vector edges; // defining the class for the vertices of the graph class Vertex { public: Vertex(char id) : id(id), prev(NULL), distance_from_start(MAX_INT) { vertices.push_back(this); } public: char id; Vertex* prev; int distance_from_start; }; // defining the class for the edges of the graph class Edge { public: Edge(Vertex* vertexOne, Vertex* vertexTwo, int distance) : vertexOne(vertexOne), vertexTwo(vertexTwo), distance(distance) { edges.push_back(this); } bool Connects(Vertex* vertexOne, Vertex* vertexTwo) public: Vertex* vertexOne; Vertex* vertexTwo; int distance; }; // defining the function to collect the details of the graph void DijkstraAlgorithm() { // declaring some vertices Vertex* vertex_a = new Vertex(&apos;A&apos;); Vertex* vertex_b = new Vertex(&apos;B&apos;); Vertex* vertex_c = new Vertex(&apos;C&apos;); Vertex* vertex_d = new Vertex(&apos;D&apos;); Vertex* vertex_e = new Vertex(&apos;E&apos;); Vertex* vertex_f = new Vertex(&apos;F&apos;); Vertex* vertex_g = new Vertex(&apos;G&apos;); // declaring some edges Edge* edge_1 = new Edge(vertex_a, vertex_c, 1); Edge* edge_2 = new Edge(vertex_a, vertex_d, 2); Edge* edge_3 = new Edge(vertex_b, vertex_c, 2); Edge* edge_4 = new Edge(vertex_c, vertex_d, 1); Edge* edge_5 = new Edge(vertex_b, vertex_f, 3); Edge* edge_6 = new Edge(vertex_c, vertex_e, 3); Edge* edge_7 = new Edge(vertex_e, vertex_f, 2); Edge* edge_8 = new Edge(vertex_d, vertex_g, 1); Edge* edge_9 = new Edge(vertex_g, vertex_f, 1); vertex_a -&gt; distance_from_start = 0; // setting a start vertex // calling the Dijkstra() function to find the shortest route possible Dijkstra(); // calling the Print_Shortest_Route_To() function to print the shortest route from the source vertex to the destination vertex Print_Shortest_Route_To(vertex_f); } // defining the function for Dijkstra&apos;s Algorithm void Dijkstra() { while (vertices.size() &gt; 0) { Vertex* smallest = Extract_Smallest(vertices); vector* adjacent_nodes = Adjacent_Remaining_Nodes(smallest); const int size = adjacent_nodes -&gt; size(); for (int i = 0; i at(i); int distance = Distance(smallest, adjacent) + smallest -&gt; distance_from_start; if (distance distance_from_start) { adjacent -&gt; distance_from_start = distance; adjacent -&gt; prev = smallest; } } delete adjacent_nodes; } } // defining the function to find the vertex with the shortest distance, removing it, and returning it Vertex* Extract_Smallest(vector&amp; vertices) { int size = vertices.size(); if (size == 0) return NULL; int smallest_position = 0; Vertex* smallest = vertices.at(0); for (int i = 1; i distance_from_start distance_from_start) { smallest = current; smallest_position = i; } } vertices.erase(vertices.begin() + smallest_position); return smallest; } // defining the function to return all vertices adjacent to &apos;vertex&apos; which are still in the &apos;vertices&apos; collection. vector* Adjacent_Remaining_Nodes(Vertex* vertex) { vector* adjacent_nodes = new vector(); const int size = edges.size(); for (int i = 0; i vertexOne == vertex) { adjacent = edge -&gt; vertexTwo; } else if (edge -&gt; vertexTwo == vertex) { adjacent = edge -&gt; vertexOne; } if (adjacent &amp;&amp; Contains(vertices, adjacent)) { adjacent_nodes -&gt; push_back(adjacent); } } return adjacent_nodes; } // defining the function to return distance between two connected vertices int Distance(Vertex* vertexOne, Vertex* vertexTwo) { const int size = edges.size(); for (int i = 0; i Connects(vertexOne, vertexTwo)) { return edge -&gt; distance; } } return -1; // should never happen } // defining the function to check if the &apos;vertices&apos; vector contains &apos;vertex&apos; bool Contains(vector&amp; vertices, Vertex* vertex) { const int size = vertices.size(); for (int i = 0; i <size; ++i) { if (vertex="=" vertices.at(i)) return true; } false; defining the function to print shortest route destination void print_shortest_route_to(vertex* des) vertex* prev="des;" cout << \'distance from start: \' < distance_from_start endl; while (prev) id prev; pre> <p> <strong>Output</strong> </p> <pre> Distance from start: 4 F G D A </pre> <p> <strong>Explanation:</strong> </p> <p>In the above code snippet, we included the <strong>&apos;iostream&apos;</strong> and <strong>&apos;vector&apos;</strong> header files and defined a constant value as <strong>MAX_INT = 10000000</strong> . We then used the standard namespace and prototyped the <strong>DijkstraAlgorithm()</strong> function. We then defined the main function of the program within, which we have called the <strong>DijkstraAlgorithm()</strong> function. After that, we declared some classes to create vertices and edges. We have also prototyped more functions to find the shortest possible path from the source vertex to the destination vertex and instantiated the Vertex and Edge classes. We then defined both classes to create the vertices and edges of the graph. We have then defined the <strong>DijkstraAlgorithm()</strong> function to create a graph and perform different operations. Inside this function, we have declared some vertices and edges. We then set the source vertex of the graph and called the <strong>Dijkstra()</strong> function to find the shortest possible distance and <strong>Print_Shortest_Route_To()</strong> function to print the shortest distance from the source vertex to vertex <strong>&apos;F&apos;</strong> . We have then defined the <strong>Dijkstra()</strong> function to calculate the shortest possible distances of the all the vertices from the source vertex. We have also defined some more functions to find the vertex with the shortest distance to return all the vertices adjacent to the remaining vertex, to return the distance between two connected vertices, to check if the selected vertex exists in the graph, and to print the shortest possible path from the source vertex to the destination vertex.</p> <p>As a result, the required shortest path for the vertex <strong>&apos;F&apos;</strong> from the source node is printed for the users.</p> <h3>Code for Dijkstra&apos;s Algorithm in Java</h3> <p>The following is the implementation of Dijkstra&apos;s Algorithm in the Java Programming Language:</p> <p> <strong>File: DijkstraAlgorithm.java</strong> </p> <pre> // Implementation of Dijkstra&apos;s Algorithm in Java // defining the public class for Dijkstra&apos;s Algorithm public class DijkstraAlgorithm { // defining the method to implement Dijkstra&apos;s Algorithm public void dijkstraAlgorithm(int[][] graph, int source) { // number of nodes int nodes = graph.length; boolean[] visited_vertex = new boolean[nodes]; int[] dist = new int[nodes]; for (int i = 0; i <nodes; 0 1 i++) { visited_vertex[i]="false;" dist[i]="Integer.MAX_VALUE;" } distance of self loop is zero dist[source]="0;" for (int i="0;" < nodes; updating the between neighboring vertex and source int u="find_min_distance(dist," visited_vertex); visited_vertex[u]="true;" distances all vertices v="0;" v++) if (!visited_vertex[v] && graph[u][v] !="0" (dist[u] + dist[v])) dist[v]="dist[u]" graph[u][v]; dist.length; system.out.println(string.format(\'distance from %s to %s\', source, i, dist[i])); defining method find minimum private static find_min_distance(int[] dist, boolean[] visited_vertex) minimum_distance="Integer.MAX_VALUE;" minimum_distance_vertex="-1;" (!visited_vertex[i] minimum_distance) return minimum_distance_vertex; main function public void main(string[] args) declaring nodes graphs graph[][]="new" int[][] 0, 1, 2, }, 3, }; instantiating dijkstraalgorithm() class dijkstraalgorithm test="new" dijkstraalgorithm(); calling shortest node destination test.dijkstraalgorithm(graph, 0); pre> <p> <strong>Output</strong> </p> <pre> Distance from Vertex 0 to Vertex 0 is 0 Distance from Vertex 0 to Vertex 1 is 1 Distance from Vertex 0 to Vertex 2 is 1 Distance from Vertex 0 to Vertex 3 is 2 Distance from Vertex 0 to Vertex 4 is 4 Distance from Vertex 0 to Vertex 5 is 4 Distance from Vertex 0 to Vertex 6 is 3 </pre> <p> <strong>Explanation:</strong> </p> <p>In the above snippet of code, we have defined a public class as <strong>DijkstraAlgorithm()</strong> . Inside this class, we have defined a public method as <strong>dijkstraAlgorithm()</strong> to find the shortest distance from the source vertex to the destination vertex. Inside this method, we have defined a variable to store the number of nodes. We have then defined a Boolean array to store the information regarding the visited vertices and an integer array to store their respective distances. Initially, we declared the values in both the arrays as <strong>False</strong> and <strong>MAX_VALUE</strong> , respectively. We have also set the distance of the source vertex as zero and used the <strong>for-loop</strong> to update the distance between the source vertex and destination vertices with the minimum distance. We have then updated the distances of the neighboring vertices of the selected vertex by performing relaxation and printed the shortest distances for every vertex. We have then defined a method to find the minimum distance from the source vertex to the destination vertex. We then defined the main function where we declared the vertices of the graph and instantiated the <strong>DijkstraAlgorithm()</strong> class. Finally, we have called the <strong>dijkstraAlgorithm()</strong> method to find the shortest distance between the source vertex and the destination vertices.</p> <p>As a result, the required shortest possible paths for every node from the source node are printed for the users.</p> <h3>Code for Dijkstra&apos;s Algorithm in Python</h3> <p>The following is the implementation of Dijkstra&apos;s Algorithm in the Python Programming Language:</p> <p> <strong>File: DikstraAlgorithm.py</strong> </p> <pre> # Implementation of Dijkstra&apos;s Algorithm in Python # importing the sys module import sys # declaring the list of nodes for the graph nodes = [ [0, 0, 1, 0, 1, 0, 0], [0, 0, 1, 0, 0, 1, 0], [1, 1, 0, 1, 1, 0, 0], [1, 0, 1, 0, 0, 0, 1], [0, 0, 1, 0, 0, 1, 0], [0, 1, 0, 0, 1, 0, 1], [0, 0, 0, 1, 0, 1, 0] ] # declaring the list of edges for the graph edges = [ [0, 0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 3, 0], [1, 2, 0, 1, 3, 0, 0], [2, 0, 1, 0, 0, 0, 1], [0, 0, 3, 0, 0, 2, 0], [0, 3, 0, 0, 2, 0, 1], [0, 0, 0, 1, 0, 1, 0] ] # defining the function to find which node is to be visited next def toBeVisited(): global visitedAndDistance v = -10 for index in range(numberOfNodes): if visitedAndDistance[index][0] == 0 and (v <0 1 or visitedanddistance[index][1] <="visitedAndDistance[v][1]):" v="index" return # finding the number of nodes in graph numberofnodes="len(nodes[0])" visitedanddistance="[[0," 0]] for i range(numberofnodes - 1): visitedanddistance.append([0, sys.maxsize]) node range(numberofnodes): next to be visited tovisit="toBeVisited()" neighborindex updating new distances if nodes[tovisit][neighborindex]="=" and visitedanddistance[neighborindex][0]="=" 0: newdistance="visitedAndDistance[toVisit][1]" + edges[tovisit][neighborindex] visitedanddistance[neighborindex][1]> newDistance: visitedAndDistance[neighborIndex][1] = newDistance visitedAndDistance[toVisit][0] = 1 i = 0 # printing the distance for distance in visitedAndDistance: print(&apos;Distance of&apos;, chr(ord(&apos;A&apos;) + i), &apos;from source node:&apos;, distance[1]) i = i + 1 </0></pre> <p> <strong>Output</strong> </p> <pre> Distance of A from source node: 0 Distance of B from source node: 3 Distance of C from source node: 1 Distance of D from source node: 2 Distance of E from source node: 2 Distance of F from source node: 4 Distance of G from source node: 3 </pre> <p> <strong>Explanation:</strong> </p> <p>In the above snippet of code, we have imported the <strong>sys</strong> module and declared the lists consisting of the values for the nodes and edges. We have then defined a function as <strong>toBeVisited()</strong> to find which node will be visited next. We then found the total number of nodes in the graph and set the initial distances for every node. We have then calculated the minimum distance from the source node to the destination node, performed relaxation on neighboring nodes, and updated the distances in the list. We then printed those distances from the list for the users.</p> <p>As a result, the required shortest possible paths for every node from the source node are printed for the users.</p> <h2>Time and Space Complexity of Dijkstra&apos;s Algorithm</h2> <ul> <li>The Time Complexity of Dijkstra&apos;s Algorithm is <strong>O(E log V)</strong> , where E is the number of edges and V is the number of vertices.</li> <li>The Space Complexity of Dijkstra&apos;s Algorithm is O(V), where V is the number of vertices.</li> </ul> <h2>Advantages and Disadvantages of Dijkstra&apos;s Algorithm</h2> <p> <strong>Let us discuss some advantages of Dijkstra&apos;s Algorithm:</strong> </p> <ol class="points"> <li>One primary advantage of using Dijkstra&apos;s Algorithm is that it has an almost linear time and space complexity.</li> <li>We can use this algorithm to calculate the shortest path from a single vertex to all other vertices and a single source vertex to a single destination vertex by stopping the algorithm once we get the shortest distance for the destination vertex.</li> <li>This algorithm only works for directed weighted graphs, and all the edges of this graph should be non-negative.</li> </ol> <p> <strong>Despite having multiple advantages, Dijkstra&apos;s algorithm has some disadvantages also, such as:</strong> </p> <ol class="points"> <li>Dijkstra&apos;s Algorithm performs a concealed exploration that utilizes a lot of time during the process.</li> <li>This algorithm is impotent to handle negative edges.</li> <li>Since this algorithm heads to the acyclic graph, it cannot calculate the exact shortest path.</li> <li>It also requires maintenance to keep a record of vertices that have been visited.</li> </ol> <h2>Some Applications of Dijkstra&apos;s Algorithm</h2> <p> <strong>Dijkstra&apos;s Algorithm has various real-world applications, some of which are stated below:</strong> </p> <ol class="points"> <tr><td>Digital Mapping Services in Google Maps:</td> There are various times when we have tried to find the distance in Google Maps either from our location to the nearest preferred location or from one city to another, which comprises multiple routes/paths connecting them; however, the application must display the minimum distance. This is only possible because Dijkstra&apos;s algorithm helps the application find the shortest between two given locations along the path. Let us consider the USA as a graph wherein the cities/places are represented as vertices, and the routes between two cities/places are represented as edges. Then with the help of Dijkstra&apos;s Algorithm, we can calculate the shortest routes between any two cities/places. </tr><tr><td>Social Networking Applications:</td> In many applications like Facebook, Twitter, Instagram, and more, many of us might have observed that these apps suggest the list of friends that a specific user may know. How do many social media companies implement this type of feature in an efficient and effective way, specifically when the system has over a billion users? The answer to this question is Dijkstra&apos;s Algorithm. The standard Dijkstra&apos;s Algorithm is generally used to estimate the shortest distance between the users measured through the connections or mutuality among them. When social networking is very small, it uses the standard Dijkstra&apos;s Algorithm in addition to some other features in order to determine the shortest paths. However, when the graph is much bigger, the standard algorithm takes several seconds to count, and thus, some advanced algorithms are used as the alternative. </tr><tr><td>Telephone Network:</td> As some of us might know, in a telephone network, each transmission line has a bandwidth, &apos;b&apos;. The bandwidth is the highest frequency that the transmission line can support. In general, if the frequency of the signal is higher in a specific line, the signal is reduced by that line. Bandwidth represents the amount of information that can be transmitted by the line. Let us consider a city a graph wherein the switching stations are represented using the vertices, the transmission lines are represented as the edges, and the bandwidth, &apos;b&apos;, is represented using the weight of the edges. Thus, as we can observe, the telephone network can also fall into the category of the shortest distance problem and can be solved using Dijkstra&apos;s Algorithm. </tr><tr><td>Flight Program:</td> Suppose that a person requires software to prepare an agenda of flights for customers. The agent has access to a database with all flights and airports. In addition to the flight number, origin airport, and destination, the flights also have departure and arrival times. So, in order to determine the earliest arrival time for the selected destination from the original airport and given start time, the agents make use of Dijkstra&apos;s Algorithm. </tr><tr><td>IP routing to find Open Shortest Path First:</td> Open Shortest Path First (abbreviated as OSPF) is a link-state routing protocol used to find the best path between the source and destination router with the help of its own Shortest Path First. Dijkstra&apos;s Algorithm is extensively utilized in the routing protocols required by the routers in order to update their forwarding table. The algorithm gives the shortest cost path from the source router to the other routers present in the network. </tr><tr><td>Robotic Path:</td> These days, drones and robots have come into existence, some operated manually and some automatically. The drones and robots which are operated automatically and used to deliver the packages to a given location or used for any certain task are configured with Dijkstra&apos;s Algorithm module so that whenever the source and destination are known, the drone and robot will move in the ordered direction by following the shortest path keeping the time taken to a minimum in order to deliver the packages. </tr><tr><td>Designate the File Server:</td> Dijkstra&apos;s Algorithm is also used to designate a file server in a Local Area Network (LAN). Suppose that an infinite period of time is needed for the transmission of the files from one computer to another. So, to minimize the number of &apos;hops&apos; from the file server to every other computer on the network, we will use Dijkstra&apos;s Algorithm. This algorithm will return the shortest path between the networks resulting in the minimum number of hops. </tr></ol> <h2>The Conclusion</h2> <ul> <li>In the above tutorial, firstly, we have understood the basic concepts of Graph along with its types and applications.</li> <li>We then learned about Dijkstra&apos;s Algorithm and its history.</li> <li>We have also understood the fundamental working of Dijkstra&apos;s Algorithm with the help of an example.</li> <li>After that, we studied how to write code for Dijkstra&apos;s Algorithm with the help of Pseudocode.</li> <li>We observed its implementation in programming languages like C, C++, Java, and Python with proper outputs and explanations.</li> <li>We have also understood the Time and Space Complexity of Dijkstra&apos;s Algorithm.</li> <li>Finally, we have discussed the advantages and disadvantages of Dijkstra&apos;s algorithm and some of its real-life applications.</li> </ul> <hr></nodes;></pre></size;>

説明:

上記のコード スニペットには、 「iostream」 そして 'ベクター' ヘッダー ファイルを作成し、定数値を次のように定義しました MAX_INT = 10000000 。次に、標準の名前空間を使用してプロトタイプを作成しました。 ダイクストラアルゴリズム() 関数。次に、その中でプログラムの main 関数を定義しました。これを、 ダイクストラアルゴリズム() 関数。その後、頂点と辺を作成するためにいくつかのクラスを宣言しました。また、ソース頂点から宛先頂点までの可能な最短パスを見つけるためにさらに多くの関数のプロトタイプを作成し、Vertex クラスと Edge クラスをインスタンス化しました。次に、グラフの頂点とエッジを作成するために両方のクラスを定義しました。次に、 ダイクストラアルゴリズム() グラフを作成し、さまざまな操作を実行する関数。この関数内で、いくつかの頂点とエッジを宣言しました。次に、グラフのソース頂点を設定し、 ディクストラ() 可能な最短距離を見つける機能と Print_Shortest_Route_To() ソース頂点から頂点までの最短距離を出力する関数 「ふ」 。次に、 ディクストラ() ソース頂点からすべての頂点までの可能な最短距離を計算する関数。また、最短距離の頂点を見つけて残りの頂点に隣接するすべての頂点を返し、接続された 2 つの頂点間の距離を返し、選択した頂点がグラフ内に存在するかどうかを確認し、グラフを出力する関数をさらにいくつか定義しました。ソース頂点から宛先頂点までの可能な最短のパス。

その結果、頂点に必要な最短パスは 「ふ」 ソースノードからの情報がユーザー向けに出力されます。

Java でのダイクストラのアルゴリズムのコード

以下は、Java プログラミング言語でのダイクストラのアルゴリズムの実装です。

ファイル: DijkstraAlgorithm.java

 // Implementation of Dijkstra&apos;s Algorithm in Java // defining the public class for Dijkstra&apos;s Algorithm public class DijkstraAlgorithm { // defining the method to implement Dijkstra&apos;s Algorithm public void dijkstraAlgorithm(int[][] graph, int source) { // number of nodes int nodes = graph.length; boolean[] visited_vertex = new boolean[nodes]; int[] dist = new int[nodes]; for (int i = 0; i <nodes; 0 1 i++) { visited_vertex[i]="false;" dist[i]="Integer.MAX_VALUE;" } distance of self loop is zero dist[source]="0;" for (int i="0;" < nodes; updating the between neighboring vertex and source int u="find_min_distance(dist," visited_vertex); visited_vertex[u]="true;" distances all vertices v="0;" v++) if (!visited_vertex[v] && graph[u][v] !="0" (dist[u] + dist[v])) dist[v]="dist[u]" graph[u][v]; dist.length; system.out.println(string.format(\'distance from %s to %s\', source, i, dist[i])); defining method find minimum private static find_min_distance(int[] dist, boolean[] visited_vertex) minimum_distance="Integer.MAX_VALUE;" minimum_distance_vertex="-1;" (!visited_vertex[i] minimum_distance) return minimum_distance_vertex; main function public void main(string[] args) declaring nodes graphs graph[][]="new" int[][] 0, 1, 2, }, 3, }; instantiating dijkstraalgorithm() class dijkstraalgorithm test="new" dijkstraalgorithm(); calling shortest node destination test.dijkstraalgorithm(graph, 0); pre> <p> <strong>Output</strong> </p> <pre> Distance from Vertex 0 to Vertex 0 is 0 Distance from Vertex 0 to Vertex 1 is 1 Distance from Vertex 0 to Vertex 2 is 1 Distance from Vertex 0 to Vertex 3 is 2 Distance from Vertex 0 to Vertex 4 is 4 Distance from Vertex 0 to Vertex 5 is 4 Distance from Vertex 0 to Vertex 6 is 3 </pre> <p> <strong>Explanation:</strong> </p> <p>In the above snippet of code, we have defined a public class as <strong>DijkstraAlgorithm()</strong> . Inside this class, we have defined a public method as <strong>dijkstraAlgorithm()</strong> to find the shortest distance from the source vertex to the destination vertex. Inside this method, we have defined a variable to store the number of nodes. We have then defined a Boolean array to store the information regarding the visited vertices and an integer array to store their respective distances. Initially, we declared the values in both the arrays as <strong>False</strong> and <strong>MAX_VALUE</strong> , respectively. We have also set the distance of the source vertex as zero and used the <strong>for-loop</strong> to update the distance between the source vertex and destination vertices with the minimum distance. We have then updated the distances of the neighboring vertices of the selected vertex by performing relaxation and printed the shortest distances for every vertex. We have then defined a method to find the minimum distance from the source vertex to the destination vertex. We then defined the main function where we declared the vertices of the graph and instantiated the <strong>DijkstraAlgorithm()</strong> class. Finally, we have called the <strong>dijkstraAlgorithm()</strong> method to find the shortest distance between the source vertex and the destination vertices.</p> <p>As a result, the required shortest possible paths for every node from the source node are printed for the users.</p> <h3>Code for Dijkstra&apos;s Algorithm in Python</h3> <p>The following is the implementation of Dijkstra&apos;s Algorithm in the Python Programming Language:</p> <p> <strong>File: DikstraAlgorithm.py</strong> </p> <pre> # Implementation of Dijkstra&apos;s Algorithm in Python # importing the sys module import sys # declaring the list of nodes for the graph nodes = [ [0, 0, 1, 0, 1, 0, 0], [0, 0, 1, 0, 0, 1, 0], [1, 1, 0, 1, 1, 0, 0], [1, 0, 1, 0, 0, 0, 1], [0, 0, 1, 0, 0, 1, 0], [0, 1, 0, 0, 1, 0, 1], [0, 0, 0, 1, 0, 1, 0] ] # declaring the list of edges for the graph edges = [ [0, 0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 3, 0], [1, 2, 0, 1, 3, 0, 0], [2, 0, 1, 0, 0, 0, 1], [0, 0, 3, 0, 0, 2, 0], [0, 3, 0, 0, 2, 0, 1], [0, 0, 0, 1, 0, 1, 0] ] # defining the function to find which node is to be visited next def toBeVisited(): global visitedAndDistance v = -10 for index in range(numberOfNodes): if visitedAndDistance[index][0] == 0 and (v <0 1 or visitedanddistance[index][1] <="visitedAndDistance[v][1]):" v="index" return # finding the number of nodes in graph numberofnodes="len(nodes[0])" visitedanddistance="[[0," 0]] for i range(numberofnodes - 1): visitedanddistance.append([0, sys.maxsize]) node range(numberofnodes): next to be visited tovisit="toBeVisited()" neighborindex updating new distances if nodes[tovisit][neighborindex]="=" and visitedanddistance[neighborindex][0]="=" 0: newdistance="visitedAndDistance[toVisit][1]" + edges[tovisit][neighborindex] visitedanddistance[neighborindex][1]> newDistance: visitedAndDistance[neighborIndex][1] = newDistance visitedAndDistance[toVisit][0] = 1 i = 0 # printing the distance for distance in visitedAndDistance: print(&apos;Distance of&apos;, chr(ord(&apos;A&apos;) + i), &apos;from source node:&apos;, distance[1]) i = i + 1 </0></pre> <p> <strong>Output</strong> </p> <pre> Distance of A from source node: 0 Distance of B from source node: 3 Distance of C from source node: 1 Distance of D from source node: 2 Distance of E from source node: 2 Distance of F from source node: 4 Distance of G from source node: 3 </pre> <p> <strong>Explanation:</strong> </p> <p>In the above snippet of code, we have imported the <strong>sys</strong> module and declared the lists consisting of the values for the nodes and edges. We have then defined a function as <strong>toBeVisited()</strong> to find which node will be visited next. We then found the total number of nodes in the graph and set the initial distances for every node. We have then calculated the minimum distance from the source node to the destination node, performed relaxation on neighboring nodes, and updated the distances in the list. We then printed those distances from the list for the users.</p> <p>As a result, the required shortest possible paths for every node from the source node are printed for the users.</p> <h2>Time and Space Complexity of Dijkstra&apos;s Algorithm</h2> <ul> <li>The Time Complexity of Dijkstra&apos;s Algorithm is <strong>O(E log V)</strong> , where E is the number of edges and V is the number of vertices.</li> <li>The Space Complexity of Dijkstra&apos;s Algorithm is O(V), where V is the number of vertices.</li> </ul> <h2>Advantages and Disadvantages of Dijkstra&apos;s Algorithm</h2> <p> <strong>Let us discuss some advantages of Dijkstra&apos;s Algorithm:</strong> </p> <ol class="points"> <li>One primary advantage of using Dijkstra&apos;s Algorithm is that it has an almost linear time and space complexity.</li> <li>We can use this algorithm to calculate the shortest path from a single vertex to all other vertices and a single source vertex to a single destination vertex by stopping the algorithm once we get the shortest distance for the destination vertex.</li> <li>This algorithm only works for directed weighted graphs, and all the edges of this graph should be non-negative.</li> </ol> <p> <strong>Despite having multiple advantages, Dijkstra&apos;s algorithm has some disadvantages also, such as:</strong> </p> <ol class="points"> <li>Dijkstra&apos;s Algorithm performs a concealed exploration that utilizes a lot of time during the process.</li> <li>This algorithm is impotent to handle negative edges.</li> <li>Since this algorithm heads to the acyclic graph, it cannot calculate the exact shortest path.</li> <li>It also requires maintenance to keep a record of vertices that have been visited.</li> </ol> <h2>Some Applications of Dijkstra&apos;s Algorithm</h2> <p> <strong>Dijkstra&apos;s Algorithm has various real-world applications, some of which are stated below:</strong> </p> <ol class="points"> <tr><td>Digital Mapping Services in Google Maps:</td> There are various times when we have tried to find the distance in Google Maps either from our location to the nearest preferred location or from one city to another, which comprises multiple routes/paths connecting them; however, the application must display the minimum distance. This is only possible because Dijkstra&apos;s algorithm helps the application find the shortest between two given locations along the path. Let us consider the USA as a graph wherein the cities/places are represented as vertices, and the routes between two cities/places are represented as edges. Then with the help of Dijkstra&apos;s Algorithm, we can calculate the shortest routes between any two cities/places. </tr><tr><td>Social Networking Applications:</td> In many applications like Facebook, Twitter, Instagram, and more, many of us might have observed that these apps suggest the list of friends that a specific user may know. How do many social media companies implement this type of feature in an efficient and effective way, specifically when the system has over a billion users? The answer to this question is Dijkstra&apos;s Algorithm. The standard Dijkstra&apos;s Algorithm is generally used to estimate the shortest distance between the users measured through the connections or mutuality among them. When social networking is very small, it uses the standard Dijkstra&apos;s Algorithm in addition to some other features in order to determine the shortest paths. However, when the graph is much bigger, the standard algorithm takes several seconds to count, and thus, some advanced algorithms are used as the alternative. </tr><tr><td>Telephone Network:</td> As some of us might know, in a telephone network, each transmission line has a bandwidth, &apos;b&apos;. The bandwidth is the highest frequency that the transmission line can support. In general, if the frequency of the signal is higher in a specific line, the signal is reduced by that line. Bandwidth represents the amount of information that can be transmitted by the line. Let us consider a city a graph wherein the switching stations are represented using the vertices, the transmission lines are represented as the edges, and the bandwidth, &apos;b&apos;, is represented using the weight of the edges. Thus, as we can observe, the telephone network can also fall into the category of the shortest distance problem and can be solved using Dijkstra&apos;s Algorithm. </tr><tr><td>Flight Program:</td> Suppose that a person requires software to prepare an agenda of flights for customers. The agent has access to a database with all flights and airports. In addition to the flight number, origin airport, and destination, the flights also have departure and arrival times. So, in order to determine the earliest arrival time for the selected destination from the original airport and given start time, the agents make use of Dijkstra&apos;s Algorithm. </tr><tr><td>IP routing to find Open Shortest Path First:</td> Open Shortest Path First (abbreviated as OSPF) is a link-state routing protocol used to find the best path between the source and destination router with the help of its own Shortest Path First. Dijkstra&apos;s Algorithm is extensively utilized in the routing protocols required by the routers in order to update their forwarding table. The algorithm gives the shortest cost path from the source router to the other routers present in the network. </tr><tr><td>Robotic Path:</td> These days, drones and robots have come into existence, some operated manually and some automatically. The drones and robots which are operated automatically and used to deliver the packages to a given location or used for any certain task are configured with Dijkstra&apos;s Algorithm module so that whenever the source and destination are known, the drone and robot will move in the ordered direction by following the shortest path keeping the time taken to a minimum in order to deliver the packages. </tr><tr><td>Designate the File Server:</td> Dijkstra&apos;s Algorithm is also used to designate a file server in a Local Area Network (LAN). Suppose that an infinite period of time is needed for the transmission of the files from one computer to another. So, to minimize the number of &apos;hops&apos; from the file server to every other computer on the network, we will use Dijkstra&apos;s Algorithm. This algorithm will return the shortest path between the networks resulting in the minimum number of hops. </tr></ol> <h2>The Conclusion</h2> <ul> <li>In the above tutorial, firstly, we have understood the basic concepts of Graph along with its types and applications.</li> <li>We then learned about Dijkstra&apos;s Algorithm and its history.</li> <li>We have also understood the fundamental working of Dijkstra&apos;s Algorithm with the help of an example.</li> <li>After that, we studied how to write code for Dijkstra&apos;s Algorithm with the help of Pseudocode.</li> <li>We observed its implementation in programming languages like C, C++, Java, and Python with proper outputs and explanations.</li> <li>We have also understood the Time and Space Complexity of Dijkstra&apos;s Algorithm.</li> <li>Finally, we have discussed the advantages and disadvantages of Dijkstra&apos;s algorithm and some of its real-life applications.</li> </ul> <hr></nodes;>

説明:

上記のコード スニペットでは、パブリック クラスを次のように定義しています。 ダイクストラアルゴリズム() 。このクラス内で、パブリック メソッドを次のように定義しました。 ダイクストラアルゴリズム() ソース頂点からターゲット頂点までの最短距離を見つけます。このメソッド内で、ノードの数を保存する変数を定義しました。次に、訪問した頂点に関する情報を格納するブール配列と、それぞれの距離を格納する整数配列を定義しました。最初に、両方の配列の値を次のように宣言しました。 間違い そして MAX_VALUE 、 それぞれ。また、ソース頂点の距離をゼロに設定し、 forループ ソース頂点と宛先頂点の間の距離を最小距離で更新します。次に、緩和を実行して選択した頂点の隣接する頂点の距離を更新し、すべての頂点の最短距離を出力しました。次に、ソース頂点から宛先頂点までの最小距離を見つけるメソッドを定義しました。次に、グラフの頂点を宣言し、インスタンス化する main 関数を定義しました。 ダイクストラアルゴリズム() クラス。最後に、私たちは ダイクストラアルゴリズム() ソース頂点と宛先頂点の間の最短距離を見つけるメソッド。

その結果、ソース ノードからすべてのノードに必要な最短パスがユーザーに表示されます。

Python でのダイクストラのアルゴリズムのコード

以下は、Python プログラミング言語でのダイクストラのアルゴリズムの実装です。

ファイル: DikstraAlgorithm.py

 # Implementation of Dijkstra&apos;s Algorithm in Python # importing the sys module import sys # declaring the list of nodes for the graph nodes = [ [0, 0, 1, 0, 1, 0, 0], [0, 0, 1, 0, 0, 1, 0], [1, 1, 0, 1, 1, 0, 0], [1, 0, 1, 0, 0, 0, 1], [0, 0, 1, 0, 0, 1, 0], [0, 1, 0, 0, 1, 0, 1], [0, 0, 0, 1, 0, 1, 0] ] # declaring the list of edges for the graph edges = [ [0, 0, 1, 0, 2, 0, 0], [0, 0, 2, 0, 0, 3, 0], [1, 2, 0, 1, 3, 0, 0], [2, 0, 1, 0, 0, 0, 1], [0, 0, 3, 0, 0, 2, 0], [0, 3, 0, 0, 2, 0, 1], [0, 0, 0, 1, 0, 1, 0] ] # defining the function to find which node is to be visited next def toBeVisited(): global visitedAndDistance v = -10 for index in range(numberOfNodes): if visitedAndDistance[index][0] == 0 and (v <0 1 or visitedanddistance[index][1] <="visitedAndDistance[v][1]):" v="index" return # finding the number of nodes in graph numberofnodes="len(nodes[0])" visitedanddistance="[[0," 0]] for i range(numberofnodes - 1): visitedanddistance.append([0, sys.maxsize]) node range(numberofnodes): next to be visited tovisit="toBeVisited()" neighborindex updating new distances if nodes[tovisit][neighborindex]="=" and visitedanddistance[neighborindex][0]="=" 0: newdistance="visitedAndDistance[toVisit][1]" + edges[tovisit][neighborindex] visitedanddistance[neighborindex][1]> newDistance: visitedAndDistance[neighborIndex][1] = newDistance visitedAndDistance[toVisit][0] = 1 i = 0 # printing the distance for distance in visitedAndDistance: print(&apos;Distance of&apos;, chr(ord(&apos;A&apos;) + i), &apos;from source node:&apos;, distance[1]) i = i + 1 </0>

出力

 Distance of A from source node: 0 Distance of B from source node: 3 Distance of C from source node: 1 Distance of D from source node: 2 Distance of E from source node: 2 Distance of F from source node: 4 Distance of G from source node: 3 

説明:

上記のコード スニペットでは、 システム モジュールを作成し、ノードとエッジの値で構成されるリストを宣言します。次に関数を次のように定義しました。 toBeVisited() 次にどのノードを訪問するかを確認します。次に、グラフ内のノードの総数を見つけて、すべてのノードの初期距離を設定しました。次に、ソース ノードから宛先ノードまでの最小距離を計算し、隣接するノードで緩和を実行し、リスト内の距離を更新しました。次に、ユーザー向けにリストからそれらの距離を出力しました。

その結果、ソース ノードからすべてのノードに必要な最短パスがユーザーに表示されます。

ダイクストラアルゴリズムの時間と空間の複雑さ

  • ダイクストラアルゴリズムの時間計算量は次のとおりです。 O(E log V) ここで、E はエッジの数、V は頂点の数です。
  • ダイクストラ アルゴリズムの空間複雑度は O(V) です。ここで、V は頂点の数です。

ダイクストラアルゴリズムの長所と短所

ダイクストラのアルゴリズムのいくつかの利点について説明します。

  1. ダイクストラのアルゴリズムを使用する主な利点の 1 つは、時間と空間の複雑さがほぼ線形であることです。
  2. このアルゴリズムを使用すると、宛先頂点の最短距離が得られたらアルゴリズムを停止することで、単一の頂点から他のすべての頂点への最短パス、および単一のソース頂点から単一の宛先頂点への最短パスを計算できます。
  3. このアルゴリズムは有向重み付きグラフに対してのみ機能し、このグラフのすべてのエッジは非負である必要があります。

ダイクストラのアルゴリズムには複数の利点があるにもかかわらず、次のような欠点もあります。

  1. ダイクストラのアルゴリズムは、プロセス中に多くの時間を費やす隠蔽探索を実行します。
  2. このアルゴリズムは、負のエッジを処理することができません。
  3. このアルゴリズムは非巡回グラフに向かうため、正確な最短パスを計算できません。
  4. また、訪問した頂点の記録を保持するためのメンテナンスも必要です。

ダイクストラのアルゴリズムのいくつかの応用

ダイクストラのアルゴリズムにはさまざまな現実世界の応用例があり、その一部を以下に示します。

    Google マップのデジタル マッピング サービス:Google マップで、現在地から最も近い希望の場所まで、またはある都市から別の都市までの距離(それらを結ぶ複数のルート/パスで構成されます)を検索しようとしたことが何度もあります。ただし、アプリケーションは最小距離を表示する必要があります。これが可能なのは、アプリケーションがパスに沿った指定された 2 つの位置間の最短距離を見つけるのにダイクストラのアルゴリズムが役立つからです。米国を、都市/場所が頂点として表され、2 つの都市/場所間のルートがエッジとして表されるグラフとして考えてみましょう。次に、ダイクストラのアルゴリズムを利用して、任意の 2 つの都市/場所間の最短ルートを計算できます。ソーシャル ネットワーキング アプリケーション:Facebook、Twitter、Instagram などの多くのアプリケーションで、これらのアプリが特定のユーザーが知っている可能性のある友達のリストを提案していることに気付いた人は多いかもしれません。特にシステムのユーザーが 10 億人を超える場合、多くのソーシャル メディア企業はこの種の機能を効率的かつ効果的な方法でどのように実装しているのでしょうか?この質問に対する答えは、ダイクストラのアルゴリズムです。標準のダイクストラ アルゴリズムは、一般に、ユーザー間の接続または相互関係を通じて測定されたユーザー間の最短距離を推定するために使用されます。ソーシャル ネットワーキングが非常に小規模な場合、最短パスを決定するために他の機能に加えて標準のダイクストラ アルゴリズムが使用されます。ただし、グラフが非常に大きい場合、標準アルゴリズムではカウントに数秒かかるため、いくつかの高度なアルゴリズムが代替として使用されます。電話ネットワーク:ご存知の方もいるかもしれませんが、電話ネットワークでは、各伝送回線には帯域幅「b」があります。帯域幅は、伝送線がサポートできる最高の周波数です。一般に、特定のラインで信号の周波数が高い場合、信号はそのラインによって低減されます。帯域幅は、回線によって送信できる情報の量を表します。交換局が頂点を使用して表され、伝送路がエッジとして表され、帯域幅「b」がエッジの重みを使用して表される都市のグラフを考えてみましょう。したがって、ご覧のとおり、電話ネットワークも最短距離問題の範疇に入る可能性があり、ダイクストラのアルゴリズムを使用して解決できます。フライトプログラム:ある人が顧客のフライトの予定を準備するソフトウェアを必要としているとします。エージェントは、すべてのフライトと空港のデータベースにアクセスできます。フライトには、便名、出発空港、目的地に加えて、出発時刻と到着時刻も含まれています。したがって、元の空港から選択した目的地への最も早い到着時刻と指定された開始時刻を決定するために、エージェントはダイクストラのアルゴリズムを利用します。最初にオープン最短パスを見つけるための IP ルーティング:Open Shortest Path First (OSPF と略される) は、独自の Shortest Path First を利用して送信元ルーターと宛先ルーター間の最適なパスを見つけるために使用されるリンクステート ルーティング プロトコルです。ダイクストラのアルゴリズムは、ルーターが転送テーブルを更新するために必要なルーティング プロトコルで広く利用されています。このアルゴリズムは、ソース ルーターからネットワーク内に存在する他のルーターまでの最短コスト パスを提供します。ロボットのパス:最近ではドローンやロボットが登場しており、手動で操作するものや自動で操作するものもあります。自動的に操作され、指定された場所に荷物を配達したり、特定のタスクに使用されるドローンとロボットは、ダイクストラのアルゴリズム モジュールで構成されているため、出発地と目的地が判明すると、ドローンとロボットは指示された方向に移動します。最短経路をたどることで、荷物の配達にかかる時間を最小限に抑えます。ファイルサーバーを指定します。ダイクストラのアルゴリズムは、ローカル エリア ネットワーク (LAN) 内のファイル サーバーを指定するためにも使用されます。あるコンピュータから別のコンピュータへのファイルの送信に無限の時間が必要だと仮定します。したがって、ファイル サーバーからネットワーク上の他のすべてのコンピューターへの「ホップ」数を最小限に抑えるために、ダイクストラのアルゴリズムを使用します。このアルゴリズムは、ホップ数が最小になるネットワーク間の最短パスを返します。

結論

  • 上記のチュートリアルでは、まず、Graph の基本概念とその種類および応用について理解しました。
  • 次に、ダイクストラのアルゴリズムとその歴史について学びました。
  • また、例の助けを借りて、ダイクストラのアルゴリズムの基本的な仕組みも理解しました。
  • その後、擬似コードを使用してダイクストラアルゴリズムのコードを記述する方法を研究しました。
  • C、C++、Java、Python などのプログラミング言語での実装を、適切な出力と説明とともに観察しました。
  • ダイクストラのアルゴリズムの時間と空間の複雑さも理解しました。
  • 最後に、ダイクストラのアルゴリズムとその実際の応用例の長所と短所について説明しました。