Dijkstra演算法 學習筆記

2021-07-26 03:04:15 字數 2085 閱讀 4223

dijkstra演算法用於求最短路徑,原理的話可以去網上搜搜,有一些講得還是比較清楚的。筆者是在學opencv的時候接觸到的,不過**寫出來似乎跟c++關係比較大,無妨,會用就好。

感謝| 最短路徑—dijkstra演算法和floyd演算法)和| dijkstra演算法(matlab)) 這兩篇博文的作者。本文的話,系大半轉小半原創吧。

在matlab裡的實現與在c++中的實現有點不同,matlab裡面矩陣行列從1開始,而c/c++的則從0開始,處理的時候有一些小細節要注意一下。另外,我c++也沒學多少,有講得不對的請勿見怪!好,閒話不說,上**:

#include 

#include

using

namespace

std;

//---------------------【全域性變數宣告】-----------------------

const

int inf = 9999;

//const int size = 4;

//int a[size][size] =

//,//,

//,// };

const

int size = 6;

int a[size][size] = ,,,

,,};//--------------------【函式宣告部分】----------------------------

void dijkstra(int v0, int e);

int main()

void dijkstra(int v0, int e)

dist[v0] = 0;

s[v0] = true;

for (int i = 1; i < n; i++)

}s[index] = true; //遍歷後設定為已訪問的點

for (int j = 0; j < n; j++)

//如果經過index節點,從起點到每個節點的路徑長度更小,則更新

if (dist[index] + a[index][j] < dist[j])

}//結果處理

int distance = dist[e]; //最短距離

//回溯法 從尾部往前尋找搜尋路徑

int t = e, p = -1,

patht[size] = ;

while ((t != v0) && t >= 0)

//對應回矩陣

vector

path;

path.push_back(v0 + 1);

for (int i = 1; i < size; i++)

if (patht[i] >= 0)

path.push_back(patht[i] + 1);

//輸出

cout

<< "最短距離:"

<< distance << endl;

cout

<< "路徑為:";

for (int i = 0; i < path.size(); i++)

cout

<< path[i] << " -> ";

}

**中註明了兩個檢測模板,分別是4x4和6x6的,main()方法裡預設寫了個用6x6的測試,結果如下:

讀者可以自行注釋掉相應內容,在main裡改改引數,可以試試4x4的測試。

最後,函式是沒有寫返回引數之類的,讀者可自由變通,下面給了個參考:

//--------------------------【函式宣告部分】----------------------------

void dijkstra(int v0, int e, vector

&road)

要儲存包含路徑的陣列的話,用一般的陣列長度不好確定,可考慮vector<>,c++有提供的,標頭檔案宣告一下就好。

dijkstra演算法學習筆記

dijkstra是一種單源最短路徑演算法,即求乙個點到其他點的最短路。不能處理負邊權。最近某種廣為人知的演算法頻繁被卡,讓dijkstra逐漸成為了主流,甚至在初賽中鞭屍了spfa dijkstra效率還是不錯的,而且不容易被卡。用dis陣列儲存最短路徑。初始化時,dis s 設定為0 s為起點 其...

Dijkstra演算法學習

dijkstra演算法是求解有向圖最短路徑的經典演算法,計算從乙個指定的初始結點到其他各個結點最短路徑。它的理論基礎就是一條最短路徑的子路徑也一定是最短的。實現如下 將所有結點分為兩個集合,乙個命名為s集,乙個命名為u集。s集中的點是我們已知其最短路徑的點,u集中的點是我們還未知其最短路徑的點。因此...

演算法學習整理 一 Dijkstra

假設構建的是一副無向圖 圖中有0 6 7個點,每段線表示從乙個點到另乙個點的值 dijkstra演算法的目的是找到乙個點到另乙個點的最短路徑 假設已經構建好了圖的關係,並選取了起始點a1 思路 初始化兩個點集合s和u,s包括起點a1,u包括剩餘點,遍歷計算s中點到u中點的最短距離,不相鄰 連線的距離...