挑戰程式設計競賽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.計算最終路徑 以下圖為例...