目錄
文法
參數
演算法
範例
输出
结论
首頁 後端開發 C++ 使用佛洛伊德-沃沙爾演算法找到任兩個節點之間的最短路徑

使用佛洛伊德-沃沙爾演算法找到任兩個節點之間的最短路徑

Sep 20, 2023 pm 02:21 PM
節點 最短路徑 佛洛伊德-沃沙爾算法

C 有一個宏,它被定義為一段程式碼或期望的值,並且每當使用者需要時,它將被重複使用。佛洛伊德-沃爾夏爾演算法是在給定的加權圖中找到所有頂點對之間最短路徑的過程。該演算法遵循動態規劃的方法來找到最小權重圖。

讓我們透過圖表來理解佛洛伊德-沃爾夏爾演算法的意義 -

使用佛洛伊德-沃沙爾演算法找到任兩個節點之間的最短路徑

以頂點1為來源,頂點4為目的地,求它們之間的最短路徑。

我們已經看到有兩條路徑可以連接到目標頂點4。

  • 1 -> 4 – 邊的權重為5

  • 1 -> 8 -> 3 -> 4 – 邊權重(1 2 1)為4。

在給定的圖 I 中,我們看到兩個頂點之間連接的最小邊。所以這裡頂點 8 和頂點 3 連接頂點 1 到頂點 4 的路徑以及邊是4。另一方面,頂點1到頂點4之間有一條有向邊,邊的權重為5

現在我們比較兩個權重,即45。因此,這裡 4 是根據 Floyd Warshall 演算法計算的圖的最小權重。

在本文中,我們將使用 Floyd Warshall 演算法求解任兩個給定節點之間的最短路徑。

文法

以下語法用於程式中 -

data_type[][] array_name;
登入後複製

參數

data_type[][] - 使用者提到的資料類型。第一個陣列代表行,第二個陣列代表列。所以,這代表了二維數組。

array_name - 為陣列指定的名稱。

演算法

  • 我們將使用頭檔'iostream' 啟動程序,並將巨集位置定義為'INF'(無限大),因為稍後它將滿足二維數組矩陣和if-else 語句。

  • 接下來,我們建立名為'printPath' 的全域函數定義,並接受三個參數,分別是'parent[]'、'i''j' 驗證路徑是否存在。

  • 然後我們開始主函數,並將值‘4’儲存到變數‘V’中,該變數表示頂點的數量。其次,將值以鄰接矩陣的形式儲存到變數‘dist[V][V]’。如我們所知,dist[i][j]表示2D矩陣,它定義了從'i''j'的邊的權重,透過儲存鄰接矩陣。

  • 接下來,我們正在為變數‘parent’初始化2D數組,並且大小為[V][V]

  • 在這個變數中,我們用來顯示每對頂點'i''j' w.r.t 'parent[i][j]'< /b> .

  • 透過使用兩個巢狀的for循環,我們將找到最短路徑。第一個for迴圈迭代矩陣中的行。然後,透過第二個for迴圈迭代矩陣中的列,然後我們將使用if-else語句檢查以下條件 -

    • #如果 (dist[i][j] != INF && i != j) { parent[i][j] = i;}

      的中文翻譯為:parent[i][j] = i;}

      在if語句中,我們使用'and' (&&)運算子來表示兩個條件,如果這兩個條件都滿足,那麼'i'將被儲存到'parent[i ][j]'中,從而驗證路徑存在。

    • 其他{ parent[i][j] = -1;}

      的中文翻譯為:parent[i][j] = -1;}

      在 else 語句中,我們將「-1」初始化為「parent[i][j]」,以驗證路徑不存在。

  • 現在我們從三個嵌套的for 迴圈開始,並在0 到V-1 的範圍內應用k 個頂點,在這個範圍的幫助下,我們的最短距離和路徑將被更新。在第三個巢狀循環中,我們使用以下條件,例如

if (dist[i][j] < dist[i][k] + dist[k][j]){
   dist[i][j] = dist[i][k] + dist[k][j]; 
   parent[i][j] = parent[k][j];	
}
登入後複製

    這裡 K 正在更新二維數組矩陣中的行和列的部分,這驗證了新更新的最短路徑和距離。

  • 接下來,我們透過給定以下條件,列印出所有頂點對的最短距離和路徑

    • #透過使用兩個巢狀的 for 循環,我們列印最短距離和路徑。

    • 透過在第二個for迴圈下使用if語句,我們將檢查dist[i][j]是否等於無限大。如果發現它是無窮大,則列印“INF”,否則列印最短路徑。

  • 最後,我們呼叫名為'printPath()' 的函數,透過傳遞三個參數(parent[i]、i、和j。

範例

在這個程式中,我們將使用Floyd Warshall演算法計算任兩個節點之間的最短路徑。

#include <iostream> 
using namespace std; 
#define INF 1000000000 // Infinity

void printPath(int parent[], int i, int j) {
   if (i == j) 
      cout << i << " "; 
   else if (parent[j] == -1) 
     cout << "No path exists"; 
   else
   { 
      printPath(parent, i, parent[j]); 
      cout << j << " "; 
   }
} 

int main() 
{
   int V = 4; 
   // V represent number of vertices
   int dist[V][V] = {{0, 2, INF, 4}, 
      {6, 0, 5, 3}, 
      {INF, 10, 0, 1}, 
      {7, 9, 8, 0}}; 
   // Represent the graph using adjacency matrix

   // Apply the Floyd Warshall algorithm to find the shortest paths
   int parent[V][V];
   for (int i = 0; i < V; i++) 
   { 
      for (int j = 0; j < V; j++) 
      {
         if (dist[i][j] != INF && i != j)
         parent[i][j] = i;
         else
         parent[i][j] = -1;
      }
   }
   // update the path and distance using the k vertex range from 0 to V-1.
   for (int k = 0; k < V; k++) 
   { 
      for (int i = 0; i < V; i++) 
      { 
         for (int j = 0; j < V; j++) 
         { 
            if (dist[i][j] > dist[i][k] + dist[k][j]) 
            {
               dist[i][j] = dist[i][k] + dist[k][j];
               parent[i][j] = parent[k][j];	
            }
         }
      }
   }

   // Print shortest distances and paths between all pairs of vertices
   for (int i = 0; i < V; i++) 
   { 
      for (int j = 0; j < V; j++) 
      { 
         cout << "The Shortest distance between " << i << " and " << j << " is ";
         if (dist[i][j] == INF) 
            cout << "INF "; 
         else
            cout << dist[i][j] << " ";

         cout << "and the shortest path is:- ";
         printPath(parent[i], i, j);
         cout << endl;
      } 
   } 

   return 0; 
}
登入後複製

输出

The Shortest distance between 0 and 0 is 0 and the shortest path is:- 0 
The Shortest distance between 0 and 1 is 2 and the shortest path is:- 0 1 
The Shortest distance between 0 and 2 is 7 and the shortest path is:- 0 1 2 
The Shortest distance between 0 and 3 is 4 and the shortest path is:- 0 3 
The Shortest distance between 1 and 0 is 6 and the shortest path is:- 1 0 
The Shortest distance between 1 and 1 is 0 and the shortest path is:- 1 
The Shortest distance between 1 and 2 is 5 and the shortest path is:- 1 2 
The Shortest distance between 1 and 3 is 3 and the shortest path is:- 1 3 
The Shortest distance between 2 and 0 is 8 and the shortest path is:- 2 3 0 
The Shortest distance between 2 and 1 is 10 and the shortest path is:- 2 1 
The Shortest distance between 2 and 2 is 0 and the shortest path is:- 2 
The Shortest distance between 2 and 3 is 1 and the shortest path is:- 2 3 
The Shortest distance between 3 and 0 is 7 and the shortest path is:- 3 0 
The Shortest distance between 3 and 1 is 9 and the shortest path is:- 3 1 
The Shortest distance between 3 and 2 is 8 and the shortest path is:- 3 2 
The Shortest distance between 3 and 3 is 0 and the shortest path is:- 3 
登入後複製

结论

我们学习了使用Floyd Warshall算法找到任意两个节点之间的最短路径的概念。我们使用邻接矩阵作为程序的输入,通过它我们找到了最短路径和距离。此外,为了更新路径和距离,我们使用了k个顶点来更新行和列。在我们的日常生活中,我们在谷歌地图上搜索最短路线或路径,从一个起点到目的地。

以上是使用佛洛伊德-沃沙爾演算法找到任兩個節點之間的最短路徑的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1662
14
CakePHP 教程
1418
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
樹中所有對最短路徑總和 樹中所有對最短路徑總和 Aug 28, 2023 pm 03:17 PM

在樹中,「所有節點對最短路徑總和」的術語指的是計算所有節點對的個別最短路徑的總和。一個有效的方法是使用雙重DFS(深度優先搜尋)演算法。在第一次DFS遍歷期間確定所選節點與每個其他節點之間的距離。在第二次DFS遍歷期間再次遍歷樹,將每個節點視為潛在的LCA(最低公共祖先),併計算所選LCA的後代節點對之間的距離總和。使用這種方法可以計算出樹中所有節點對最短路徑總和,並確保得到一個理想的解決方案使用的方法雙重DFS(深度優先搜尋)方法動態規劃方法雙重DFS(深度優先搜尋)方法對於樹中所有對最短路徑的

查詢從節點X開始,距離最多為D的子樹中的最小權重 查詢從節點X開始,距離最多為D的子樹中的最小權重 Aug 25, 2023 am 11:25 AM

在進行電腦程式設計時,有時需要求出源自特定節點的子樹的最小權重,條件是該子樹不能包含距離指定節點超過D個單位的節點。這個問題出現在各個領域和應用中,包括圖論、基於樹的演算法和網路最佳化。子樹是較大樹結構的子集,指定的節點作為子樹的根節點。子樹包含根節點的所有後代及其連接邊。節點的權重是指分配給該節點的特定值,可以表示其重要性、重要性或其他相關指標。在這個問題中,目標是找​​到子樹中所有節點中的最小權重,同時將子樹限制在距離根節點最多D個單位的節點。在下面的文章中,我們將深入研究從子樹中挖掘最小權重的複雜性

如何透過Vue和jsmind實現心智圖的節點複製和剪切功能? 如何透過Vue和jsmind實現心智圖的節點複製和剪切功能? Aug 15, 2023 pm 05:57 PM

如何透過Vue和jsmind實現心智圖的節點複製和剪切功能?心智圖是一種常見的思考工具,能夠幫助我們整理想法、梳理思考邏輯。而節點複製和剪切功能是心智圖中常用的操作,能讓我們更方便重複利用現有的節點,提高思考整理的效率。在本文中,我們將使用Vue和jsmind這兩個工具來實現心智圖的節點複製和剪切功能。首先,我們需要安裝Vue和jsmind,並創建

如何使用java實作最短路徑演算法 如何使用java實作最短路徑演算法 Sep 19, 2023 am 08:18 AM

如何使用Java實現最短路徑演算法概述:最短路徑演算法是圖論中一個重要的應用,在網路路由、地圖導航等領域都有廣泛的應用。在這篇文章中,我們將學習如何使用Java實作最短路徑演算法,並提供具體的程式碼範例。演算法思維:最短路徑演算法有多種實作方式,其中最著名的兩種演算法是Dijkstra演算法和A*演算法。在這裡我們將重點放在Dijkstra演算法的實作。 Dijkstra演算法的基

js刪除節點的方法是什麼 js刪除節點的方法是什麼 Sep 01, 2023 pm 05:00 PM

js刪除節點的方法有:1、removeChild()方法,用於從父節點移除指定的子節點,它需要兩個參數,第一個參數是要刪除的子節點,第二個參數是父節點;2、parentNode.removeChild()方法,可以直接透過父節點呼叫來刪除子節點;3、remove()方法,可以直接刪除節點,而無需指定父節點;4、innerHTML屬性,用於刪除節點的內容。

使用佛洛伊德-沃沙爾演算法找到任兩個節點之間的最短路徑 使用佛洛伊德-沃沙爾演算法找到任兩個節點之間的最短路徑 Sep 20, 2023 pm 02:21 PM

C++有一個宏,它被定義為一段程式碼或期望的值,並且每當使用者需要時,它將被重複使用。佛洛伊德-沃爾夏爾演算法是在給定的加權圖中找到所有頂點對之間最短路徑的過程。該演算法遵循動態規劃的方法來找到最小權重圖。讓我們透過圖表來理解佛洛伊德-沃爾夏爾演算法的意義-以頂點1為來源,頂點4為目的地,求它們之間的最短路徑。我們已經看到有兩條路徑可以連接到目標頂點4。1->4–邊的權重為51->8->3->4–邊權重(1+2+1)為4。在給定的圖I中,我們看到兩個頂點之間連接的最小邊。所以這裡頂點

js如何建立、刪除、追加及替換元素節點(附程式碼實例) js如何建立、刪除、追加及替換元素節點(附程式碼實例) Aug 06, 2022 pm 05:26 PM

本文主要跟大家介紹js是如何建立、刪除、追加及替換元素節點的,希望對需要的朋友有幫助!

檢查給定的圖中兩個節點之間的路徑是否表示最短路徑 檢查給定的圖中兩個節點之間的路徑是否表示最短路徑 Sep 07, 2023 pm 06:57 PM

要檢查圖表的兩個中心之間的給定路徑是否符合最短路徑,可以透過使用可靠的最短路徑將沿著給定路徑的整個邊緣權重與相同中心組合之間的最短距離進行比較方式計算,例如Dijkstra計算或Floyd−Warshall計算。如果給定路徑上的所有邊權重與最有限的刪除相匹配,那麼它就代表最簡單的路徑。另外:如果整個邊權重比最短距離更突出,則表示圖表中兩個中心之間存在較短的距離。使用的方法Dijkstra演算法具有邊緣反轉成本的Floyd−Warshall演算法貪心演算法Dijkstra的計算可能是一種流行的圖表遍歷計算

See all articles