單源最短路徑問題(狄克斯特拉演算法)

2021-10-14 09:00:14 字數 1978 閱讀 3907

挑戰程式設計競賽2上的一道例題

p250

#include

using

namespace std;

static

const

int max =

100;

static

const

int infty =(1

<<21)

;/這裡表示int型別最大值

static

const

int white =0;

//表示三種狀態

static

const

int gray =1;

static

const

int black =2;

//點的個數和鄰接矩陣儲存方式

int n, m[max]

[max]

;void

dijkstra()

//從零開始到每個點的最短路徑

d[0]=

0;color[0]

= gray;

//不斷迴圈直至所有點包含在內即color[i]的狀態全為black

while(1

)}//狀態全為black結束迴圈

if(u ==-1

)break

; color[u]

= black;

//更新到每個點的最短路徑d[i]

for(

int v =

0; v < n; v++)}

}}//按要求輸出

for(

int i =

0; i < n; i++)}

intmain()

}int k, c, u, v;

for(

int i =

0; i < n; i++)}

dijkstra()

;return0;

}

本演算法不具有代表性,狄克斯特拉演算法模板還有待更新,這pain文章還會繼續更新…

一月十二日更新

spfa演算法

題目鏈結點我

#include

const

int inf=(1

<<20)

;const

int maxn=

10005

;const

int maxm=

500005

;using

namespace std;

int n,m,s,cnt=0;

//head[u],u是指點的編號,head[u]的值是與u鄰接的邊的編號

int dis[maxn]

,vis[maxn]

,head[maxm]

;struct edge

edge[maxm]

;//結構體表示靜態鄰接表

void

add(

int from,

int to,

int dis)

//鄰接表建圖

void

spfa()

q.push

(s); dis[s]=0

; vis[s]=1

;//第乙個頂點入隊,進行標記

while

(!q.

empty()

)}}}

}int

main()

spfa()

;//開始跑spfa

for(

int i=

1; i<=n; i++)if

(s==i) cout<<

0<<

" ";

//如果是回到自己,直接輸出0

else cout<<<

" ";

//否則列印最短距離

return0;

}//結束

單源最短路 狄克斯特拉演算法

一般形式的用鄰接矩陣來實現dijkstra效率比較低,我這裡直接記錄的是用鄰接表的方法以及用優先佇列加以應用。首先解釋什麼是dijkstra演算法 dijkstra演算法 dijkstra演算法適用於求單源最短路,即可以求出起點到其餘各點之間的最短路。它的演算法實現是乙個不斷更新的過程。舉乙個最簡單...

找最短路徑演算法 狄克斯特拉演算法 php 實現

具體參考 演算法 這本書第7章講的,原書是用python寫的,我用php再寫一次,並稍加完善 把書上這三道練習題,拿來測試 網上再找了乙個稍 難 點的題 上 class shortpath 初始化花銷陣列,即 只知道start的鄰居節點的花銷,其它節點都是正無窮 foreach this graph...

狄克斯特拉演算法

廣度優先演算法,它找出的是段數最少的路徑 無向圖 如果我們要找出最快的路徑 加權圖 可以使用狄克斯特拉演算法。狄克斯特拉演算法包含四個步驟 1.找出 最便宜 的節點,即可在最短時間內到達的節點 2.更新該節點的鄰居的開銷 3.重複這個過程,直到對圖中的每個節點都這樣做了 4.計算最終路徑 以下圖為例...