單源最短路徑問題是這樣乙個問題:在圖中給定乙個起點,求起點到其它頂點的最短距離。dijkstra演算法是用來解決邊權非負的情況的。它的基本思想是設乙個陣列d[n]用來代表起點到其它頂點的最短距離。初始的時候d[start]為0,其它的d[i]設為無窮。然後從起點開始遍歷整個圖,若存在頂點u,使得d[u] + g[u][v] < d[v] 那麼就跟新d[v]。dijkstra的實現是通過求出起點到其他所有頂點的最短距離,這樣就可得到了起點到給定終點的距離了。
演算法框架如下:
#include
#include
#include
using namespace std;
const
int maxv =
100;
//最大頂點數
const
int inf =
0x3fffffff
;struct nodetemp;
bool vis[maxv]
;//標記該頂點是否已經訪問
int d[maxv]
;int pre[maxv]
;//記錄最短路徑
int n,m;
//頂點數和邊數
vectoradj[maxv]
;void
dijsktra
(int s)
d[s]=0
;//起點到自己的距離為0
for(
int i=
0; iif(u==-1
)return
;//表示該點和剩餘頂點不可達
vis[u]
= true;
//標記為已訪問
for(
int j=
0; j.size()
; j++)}
}}//列印路徑
void
dfs(
int start,
int end )
dfs(start,pre[end]);
printf
(" %d"
,end);}
intmain()
dijsktra
(start)
;//列印最短路徑
printf
("%d\n"
,d[end]);
//列印路徑
dfs(start,end)
;return0;
}
在求最短路徑的時候,經常會遇到其他的額外的問題,就是當最短路徑條數不唯一時,有第二個度量:
邊權最小(花費最小)
這個時候只需要在開始的時候開乙個c[maxv]陣列來記錄最小花費,初始的時候c[s]為0,其他的c[i]均為 inf(這個和求最短路徑的陣列初始化是一致的),以及cost[maxv][maxv]二維陣列來記錄兩個定點之間的花費。並且在d[v]改變的地方新增一些**即可。
if
(vis[v]
==false )
else
if(d[v]
== d[u]
+ dis)
}}
點權最大(物質重量)
這個時候需要開乙個w[maxv]來記錄起點到其它各個頂點的最大權重,weight[maxn]用來記錄每乙個頂點的權重。並且開始的時候w[s] = weight[s],其他的w[i]均置為0。也是在上面的**處做一些修改
if
(vis[v]
==false )
else
if(d[v]
== d[u]
+ dis)
}}
求最短路徑的條數
這裡需要開乙個num[maxv]的陣列來記錄起點到各個頂點最短路徑的條數。初始化的時候num[s]設定為1,其他的num[i]初始化的值為0
相關**如下:
if
(vis[v]
==false )
else
if(d[v]
== d[u]
+ dis)
}
bf演算法可以用來解決邊權為負的最短路徑問題,同時也能判斷出是否存在源點可達的負環
#include
#include
#include
using namespace std;
const
int maxv =
100;
const
int inf =
0x3fffffff
;struct node
;vectoradj[maxv]
;int d[maxv]
;//記錄最短路徑
int n,m;
bool bellman
(int s)}}
}// 判斷負環**
for(
int u=
1; u<=n; u++)}
}return true;
}
單源最短路徑問題
如圖,求v0到其他頂點的最短路徑及其長度,廢話少說,用dijkstra演算法。我在 資料結構 c語言版 裡面的 的基礎上寫了乙個直接儲存路徑的版本。看 include includeusing namespace std define maxint 1000000 src 為源節點 g 有向圖的鄰接...
單源最短路徑問題
一 單源最短路徑問題 1 求下列多級圖的單源最短路徑,寫出求解過程。根據cost i min可知 cost為 1 2 3 4 5 6 7 8 9 10 d為 1 2 34 5 6 78 9 10 p為 1 2 3 4 5 6 7 8 9 10 計算過程如下 初始 cost 1.n 0 cost 9 ...
單源最短路徑問題
給定帶權有向圖g v,e 其中每條邊的權是非負實數。給定v中的乙個頂點,稱為源。現在要計算從源到所有其它各頂點的最短路長度,這裡路的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。每條邊上標註有字母和數字,在字母旁邊的數字為路長。演算法從優先佇列中取出具有最小當前路長的結點作為當前擴充套件...