Dijkstra演算法學習

2021-07-30 20:29:14 字數 1621 閱讀 1126

dijkstra演算法是求解有向圖最短路徑的經典演算法,計算從乙個指定的初始結點到其他各個結點最短路徑。它的理論基礎就是一條最短路徑的子路徑也一定是最短的。

實現如下:

將所有結點分為兩個集合,乙個命名為s集,乙個命名為u集。s集中的點是我們已知其最短路徑的點,u集中的點是我們還未知其最短路徑的點。因此初始時刻,s集中只有乙個我們選定的起始點,u集中是除了起始點意外的所有點;而最終時刻,s集中應該包含所有的點,u集為空集。

從最後加入s集的u點出發,選出到u集中最短的那個點nextvertex,將nextvertex點加入s集,並從u集中移除nextvertex點。

更新u集各點到起點的距離。如果從起點到u點再到u集中某點的距離比之前儲存的距離小,就更新,否則不更新。

圖例:用dijkstra演算法求解如下圖的最短路徑

感覺這是我看到的乙個最好理解圖。

附上實現**:

#include

#include

#include

using

namespace

std;

intmap[5] = ,,,

,};void dijkstra(

const

int numofvertex, //圖中結點個數

const

int startvertex, //起始結點編號

intmap[5], //距離鄰接矩陣

int* distance, //起始結點到當前結點最短路徑的距離

int* prevvertex //路徑中,當前點的上乙個結點編號

) prevvertex[startvertex] = -1; //起始點的上一點為-1

int u = startvertex; //u為s集中最後加入的點,即從該點開始搜尋

for(int i=1;i//從u集中搜尋當前distance最小點

int nextvertex = u; //nextvertex為即將加入s集的點

int tempdistance = int_max;

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

}isins[nextvertex] = true; //u集中distance最小的點,加入s集

u = nextvertex; //u設定為s集中最後加入的點,接下來從這裡開始繼續找

for (int j = 0; j < numofvertex; ++j) }}

}}int main(int argc,const

char* argv)

cout

<

while(!trace.empty())

cout

<

0;}

Dijkstra演算法 學習筆記

dijkstra演算法用於求最短路徑,原理的話可以去網上搜搜,有一些講得還是比較清楚的。筆者是在學opencv的時候接觸到的,不過 寫出來似乎跟c 關係比較大,無妨,會用就好。感謝轉 最短路徑 dijkstra演算法和floyd演算法 和原 dijkstra演算法 matlab 這兩篇博文的作者。本...

dijkstra演算法學習筆記

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

演算法學習整理 一 Dijkstra

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