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到城市...