單源最短路徑(Dijkstra)

2021-07-03 19:07:37 字數 1226 閱讀 5484

dijkstra演算法基於貪心思想,計算乙個節點到其他所有節點的最短路徑。該演算法要求圖中不存在負權邊。

時間複雜度   o(n²)

基本演算法:

將圖中所有的頂點v分成兩個頂點集合va和vb。如果源點s到u的最短路徑已經確定,則點u屬於集合va,否則屬於集合vb。最開始的時候va只包含源點s,其餘的點屬於vb,演算法結束時所有由源點s可達的點屬於va,由源點s不可達的點扔留在vb中。可以在求出最短路徑長的同時記錄最短路徑,方法是記錄終點的前乙個點,這樣只要倒著查回去就能確定整條最短路徑。

具體步驟:

(1)首先初始化,將源點s到圖中各點的直接距離當做初始值記錄為s到各點的最短距離,如果不能直接到達,記為inf,s到s的距離為0.

(2)在所有屬於vb的點中找到乙個s到其路徑長度最短的點u,將u從vb中除去,加入到va中。即當前求出的從s到u的路徑為s到u的最短路徑。

(3)由新確定的u點更新s到vb中每一點v的距離,如果s到u的距離加上u到v的直接距離小於當前s到v的距離,表明新生成的最短路徑的長度要比前面計算的更短,那麼就更新這個距離,同時更新最短路徑。

(4)重複步驟(2)、(3)的過程,直到vb中已經沒有點或者vb中的點都不能由源點s到達。

#include#include#include#include#include#includeusing namespace std;

#define inf 0x3f3f3f3f

#define maxn 1010

int dist[maxn],map[maxn][maxn],vis[maxn],pre[maxn],lj[maxn];

int n,m,sum,s,e,k,a,b,c,k1,k2;

//n為點的個數(從1——n),m為邊數,dist[i]表示從源點到i的最短距離,

//map記錄圖資訊,vis[i]標記是否屬於va,不屬於va的點屬於vb,初始化

//只有源點屬於va。

void dijkstra(int s)

dist[s]=0;

pre[s]=-1;

vis[s]=1;

for(int i=1;i<=n-1;i++)//迴圈n-1次,求s到其他n-1個點的最短路徑。}}

}int main()

printf("%d\n",e);

//路徑列印結束

printf("%d\n",dist[e]);

}return 0;

}

Dijkstra 單源最短路徑

演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...

Dijkstra 單源最短路徑

演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...

Dijkstra單源最短路徑

dijkstra單源最短路徑 給定乙個帶權有向圖g v,e 其中每條邊的權是乙個非負實數。另外,還給定 v 中的乙個頂點,稱為源。現在我們要計算從源到所有其他各頂點的最短路徑長度。這裡的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。下面給出兩個計算單源最短路徑的模板。dijkstra 簡...