最短路演算法之 Dijkstra演算法

2021-06-22 21:59:43 字數 1549 閱讀 8645

dijkstra演算法

dijkstra演算法是典型最短路演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。

dijkstra演算法是用來求任意兩個頂點之間的最短路徑。在該演算法中,我們用鄰接矩陣來儲存圖。在該程式中設定乙個二維陣列來儲存任意兩個頂點之間的邊的權值。可以將任意乙個圖的資訊通過鍵盤輸入,讓後在輸入要查詢的兩個頂點,程式可以自動求出這兩個頂點之間的最短路徑。

演算法思想 

s為源,map[u,v] 為點u 和v 之間的邊的長度,結果儲存在 dis;

初始化:源的距離dis[s]設為0,其他的點距離設為無窮大,同時把所有的點狀態設為沒有擴充套件過。

迴圈n-1次:

1. 利用標記變數陣列 在沒有擴充套件過的點中取一距離最小的點u,並將其狀態設為已擴充套件。

2. 對於每個與u相鄰的點v,如果dis[u] + map[u,v]  <  dis[v],那麼把dist[v]更新成更短的距離dis[u] + map[u,v] 。此時到點v的最短路徑上,前乙個節點即為u。

結束:此時對於任意的u,dist[u]就是s到u的距離。

附 hdu 2544 最短路

做題思想

建立乙個map的二維陣列 裡面的初始值改為乙個inf(大數) 把從a到b 的路徑長度儲存進去

建立乙個dis 的陣列  儲存map[ s ][ 0 →n ]裡的資料  迴圈n-1次 每次標記乙個dis中最小的標號 並用

if(!flag[i] && dis[i]>dis[t] + map[t][i]) 該標號更新dis 陣列

更新過後 dis[ x ] 即為源點s的到x 的最短距離 

**

#include// dijkstra 演算法

#include#include#define inf 10000000

using namespace std;

int map[101][101],dis[110];

int n ,m;

void dijkstra()

}}int main()

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

dijkstra();

printf("%d\n",dis[n]); //全部迴圈過後,dis【n】的值即為從1到n 的距離;

}return 0;

}

附: acm假期集訓感悟:

一轉眼半個月過去了,上午聽師哥講演算法,看書;下午刷題,總結;

別人都說我們程式設計師苦,累;還有乙個綽號 「屌絲程式猿」;

可我並不這麼認為,每天學習演算法鍛鍊思維,刷題提高**能力和邏輯思維

在acm訓練中,最開心的時候就是花老長時間去改錯,wa一遍又一遍,終於該出了最後乙個bug ,ac!

心情就無比的舒暢,看窗外的樹葉是那樣的翠綠,天是那樣的蔚藍。

在大學生活中能過的如此充實,有動力,有目標,朝著目標一步一步的走去, 是多麼幸福的一件事

在這裡,送出我的一句話:

整個世界填滿不了十八歲男孩子的雄心和夢。

最短路 Floyd演算法和Dijkstra演算法

兩者在負權問題上不是很好,最好只處理正值,dijkstra演算法對負權毫無辦法,但是floyd演算法不能處理出現負環的東西。dijkstra演算法的話,為了方便,我認為從i到i點不可達 百部百科解釋挺好,那個堆優化挺好的 floyd演算法百部百科也不錯,都是老演算法了,哪都有資料 這位筒子的寫得很好...

最短路之dijkstra演算法

dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有 節點的最短路徑。主要特點是 以起始點為中 心向外層層擴充套件,直到擴充套件到終點為止。問題描述 在無向圖 g v,e 中,假設每條邊 e i 的長度為 w i 找到由頂點...

ACM之路 5 最短路演算法 Dijkstra演算法

簡介 dijkstra演算法是一種單源路徑演算法。時間複雜度為 o n 2 比floyd演算法 o n 3 快很多。當然,dijkstra演算法可以用堆優化後,演算法複雜度成了 o m n logn 複雜度更底了。本文只講解dijkstra的簡單演算法。問題 給予n個城市和m條道路,求從城市1到城市...