單源最短路徑 貪心演算法

2021-07-26 18:57:23 字數 1196 閱讀 1403

乙個點(源點)到其餘各個頂點的最短路徑。也叫做「單源最短路徑」dijkstra。

dijkstra的主要思想:每次找到離源點最近的乙個頂點,然後以該頂點為中心進行擴充套件,最終得到源點到其餘所有點的最短路徑

用flag標示該點是否在離源點最近的集合中

演算法步驟:

1.初始時,s只包含源點,即p=,v的距離為0。u包含除v外的其他頂點,即:q=,若v與u中頂點u有邊,則正常有權值,若u不是v的出邊鄰接點,則權值為∞。

2.從u中選取乙個距離v最小的頂點k,把k,加入p中(該選定的距離就是v到k的最短路徑長度)。

3.以k為新考慮的中間點,修改u中各頂點的距離;若從源點v到頂點u的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改後的距離值的頂點k的距離加上邊上的權。

4.重複步驟2和3直到所有頂點都包含在p中

時間複雜度是o(n^2)。其中每次找到離1號頂點最近的頂點的時間複雜度是o(n),這裡可以用「堆」來優化使降低到o(logn),

另外對於邊數m少於n^2的稀疏圖來說(m<

在最壞的情況下m就是n^2,這樣的話(n+m)logn要比n^2還要大,但是大多數情況下並不會有那麼多邊,因此(m+n)logn要比n^2小很多。

c++實現:

#includeusing namespace std;

int main()

else

} } //給有向圖的邊賦權值

int point1,point2,quanzhi;

for(i=1;i<=edgs;i++)

for(i=1;i<=points;i++)

//設定標記,對訪問過的頂點i賦予flag[i]=1,沒訪問的i賦予flag[i]=0

for(i=1;i<=points;i++)

flag[1]=1;

int min,u;

//核心演算法

貪心演算法 單源最短路徑 dijkstra

關於單源最短路徑的問題非常典型,這裡沒有給出分析與證明,僅僅給出了實現。需要指出的是,許多實現僅給出了最短路徑的長度,而沒有給出 最短路徑 這裡用給出了實現。如程式中那樣,定義乙個陣列p n 其中p i 代表 起始點v到頂點i的最短路徑中,除i本身的最後乙個頂點 即著這條路徑上i的前驅頂點,這個頂點...

貪心演算法 單源最短路徑 dijkstra

關於單源最短路徑的問題非常典型,這裡沒有給出分析與證明,僅僅給出了實現。需要指出的是,許多實現僅給出了最短路徑的長度,而沒有給出 最短路徑 這裡用給出了實現。如程式中那樣,定義乙個陣列p n 其中p i 代表 起始點v到頂點i的最短路徑中,除i本身的最後乙個頂點 即著這條路徑上i的前驅頂點,這個頂點...

貪心演算法 Dijkstra單源最短路徑

暑假寫的,主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。描述就不寫了,看相關書籍吧。dijkstra是乙個貪心演算法。package section9 第九章 貪婪演算法 dijkstra單源最短路徑 public class dijkstra int path dijsktra...