演算法導論05 貪心演算法 Dijkstra演算法

2021-10-08 15:23:49 字數 1483 閱讀 1934

問題描述:

請設計乙個演算法,實現在乙個有向圖中,給出乙個源點,計算該源點到其他所有頂點的單源最短路徑。

演算法描述:

dijkstra演算法的目的是尋找單源最短路徑,其具有以下最優子結構性質:最短路徑上的子路徑也是兩個頂點的最短路徑,此性質可以用cut&paste反證(見筆記),因此,該演算法滿足貪心演算法性質,區域性最優解也是全域性最優解,屬於貪心演算法的一種。基於此思想,若想找到源點s到v的最短路徑,只需要找到s到u的最短路徑+u到v的最短路徑,u是s到v最短路徑上的乙個頂點。

變數定義:

s:源點

w[i][j]:i到j的最短路徑

s[i]:i點是否加入最短路徑集合,=1,加入;=0,未加入。

d[i]:源點到i點的距離

n:頂點個數

m:邊個數

演算法描述:

設g為包含圖中所有頂點的集合,s為包含最短路徑頂點的集合。源點s一定在s中(距離為0),演算法的目的就是從g中找到到s點距離最短的頂點集合,並將它們加入s中。

源點到i 的最短路徑 = d[v]+w[v][i];

筆記:(-from mit演算法導論課程)

dijkstra演算法**:

//dijkstra演算法

#include

#include

int w[

1000][

1000];

//i到j的最短路徑

int s[

1000

],d[

1000];

//最短路徑點集合,0:沒有加入 1:加入;源點到i最短路徑

int n,m;

//n個點,m條邊

void

init()

void

getg()

}}void

dijkstra

(int s)

s[tmep]=1

;//最短路徑點已經加入;

}for

(int i=

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

}}intmain()

20201022更新:

該演算法簡述:每次都從原點出發,遍歷所有沒有加入最短路徑的頂點,並找到權值最小的頂點,加入最短路徑,然後更新改頂點到其他頂點距離,每次可以找到乙個最短路徑頂點。最後迴圈該過程n次,n為頂點個數。

演算法導論 13 貪心演算法

與動態規劃類似,貪心演算法也將問題化簡為規模較小的子問題,並通過遞迴解決子問題來獲取整個問題的解。不同的是,貪心問題不對子問題進行比較,而是只生成乙個非空的子問題,而使選擇在當時看上去是最優的 即 貪心 的含義 幾個互相競爭的活動都要求以獨佔的方式占用某個公用資源 如選修課程對個人可支配時間的要求,...

演算法導論之貪心演算法

參考 下面請看示例題 有n個商品,每個商品的重量為wi,為 pi,現有乙個揹包,最多能裝 的重量 其中 0 i問 怎樣裝能使包中裝入的商品價值最高 對於每個商品可以只裝該商品的一部分 偽 引數分別為 n 物品數 m 揹包最多能裝的重量 v 價值陣列 w重量陣列 void knapsack int n...

貪心演算法 1 演算法導論 21

我們先來看看乙個適應貪心演算法求解的問題 選擇活動問題。假定有乙個 n 個活動的集合 s 每個活動 a i 的舉辦時間為 s i,f i 0 leqslant s i f i 並且假定集合 s 中的活動都已按結束時間遞增的順序排列好。由於某些原因,這些活動在同一時刻只能有乙個被舉辦,即對於任意兩個活...