Dijkstra演算法求最短路徑

2021-08-10 23:20:03 字數 1136 閱讀 7850

//dijkstra演算法用來求最短距離 已經實現了

//那麼最短路徑 如何求解並列印出來呢?

//此處的方法是記錄路徑中結點的前驅

if(v未被訪問 && 以u為中介點可以使起點s到頂點v的最短距離d[v]更優 )

//程式具體實現,鄰接矩陣版

//n為頂點數,maxv為最大頂點數

int n,g[maxv][maxv];

//起點到達各點的最短路徑長度

//pre[v]表示從起點到頂點v的最短路徑的前乙個頂點(新新增)

int pre[maxv];

//標記陣列

bool vis[maxv]=;

//s為起點

void dijkstra(int s)

//起點s到達自身的距離為0

d[s]=0;

for(int i=0;iint u=-1;

int min=inf;

for(int j=0;jif(vis[j]==false && d[j]//找不到小於inf的d[u],說明剩下的頂點和起點s不連通

if(u==-1)

vis[u]=true;

for(int v=0;v//如果v未訪問 && u能到達v && 以u為中介點可以使d[v 更優

if(vis[v]==false && g[u][v]!=inf && d[u]+g[u][v]//優化d[v]

d[v]=d[u]+g[u][v];

//記錄v的前驅結點是u(新新增)

pre[v]=u;}}

}}//上面的知識求出了最短路徑上的每個點的前驅,如何求整條路徑呢?

/*比如:

//pre[4]=3;

//pre[3]=2;

//pre[2]=1;

//pre[1]=1;

*///用遞迴

//s為起點編號,v為當前訪問的頂點編號(從終點開始遞迴)

void dfs(int s,int v)

//遞迴訪問v的前驅頂點pre[v]

dfs(s,pre[v]);

//從最深處return 回來之後,輸出每一層的頂點號

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

}

Dijkstra演算法求最短路徑

參考文獻 dijkstra一般的表述通常有兩種方式,一種用永久和臨時標號方式,一種是用open,close表方式,drew為了和下面要介紹的 a 演算法和 d 演算法表述一致,這裡均採用open,close表的方式。大概過程 建立兩個表,open,close。open表儲存所有已生成而未考察的節點,...

Dijkstra演算法 求最短路徑

演算法概要 對於圖g v,e x y v 對於每個v in y,如果存在從點1到v的邊,則令 lambda v 為邊的長度 否則令 lambda v 為 infin 並設 lambda 1 為0 whiley neq 令y in y,使得 lambda y 最小 將y從y移到x 更新那些在y中與y相...

演算法 Dijkstra 求最短路徑演算法

dijkstra演算法是由e.w.dijkstra於1959年提出,又叫迪傑斯特拉演算法,它應用了貪心演算法模式,是目前公認的最好的求解最短路徑的方法。演算法解決的是有向圖中單個源點到其他頂點的最短路徑問題,其主要特點是每次迭代時選擇的下乙個頂點是標記點之外距離源點最近的頂點。但由於dijkstra...