單源最短路徑問題[dijkstra實現]
一、問題
帶權有向圖g(e,v), 找出從給定源頂點s到其它頂點v的權最小路徑。
「最短路徑」 = 最小權
二、問題求解:
求1到5的最短路徑值?
三、執行過程:
第一次:從1-->2:10 此時從1-->3沒有路徑所有是無窮大 1-->4:30 1-->5:100那麼我們發現這一組組最小的是10也就是2這一點,所以我們再把2這一點加到集合裡面來,那麼2這一點就可以當作乙個橋來用,
第二次:此時我們再從1à3就可以通過1-->2-->3:60其他的1-->4:30
1-->5:100 可以發現此時最小的應該是3,所以我們再把3這一點加入到這個集合裡面來,如此重複的去做這些事情,到最後可以發現1à5的最短路徑應該是60(1-->4-->3-->5)
四、dijkstra偽**:
int dijkstra(int s,int t)
d[s] = 0; 其餘d值為正無窮大
while (not t in s)
; //把i點新增到集合s裡
}return d[t];
}
為何鬆弛操作:
也就是說如果1-->3這點的值為dist[3]>dist[2]+map[2][3]
那麼dist[3]=dits[2]+map[2][3]
五、**實現:
#include using namespace std;
#define max 9999999
#define len 210
int map[len][len]; //某點到某點兩點間的的距離
int dist[len]; //記錄當前點到源點的最短路徑長度
int mark[len]; //加入進來的點的集合
//初始化map為正無窮大
void init()
}}}
int main()
}mydijstra(n,1);//呼叫方法
//輸出1到5的最短路徑
cout<
六、測試資料:
5 71 2 10
1 4 30
1 5 100
2 3 50
3 5 10
4 3 20
4 5 60
結果:
單源最短路徑問題
如圖,求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中的乙個頂點,稱為源。現在要計算從源到所有其它各頂點的最短路長度,這裡路的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。每條邊上標註有字母和數字,在字母旁邊的數字為路長。演算法從優先佇列中取出具有最小當前路長的結點作為當前擴充套件...