單源最短路徑:就是從某乙個頂點出發,到圖中任意頂點之間的最短路徑;
【演算法概述】:dijkstra演算法適用於解決單源最短路徑的問題。即:從源點到任意指定頂點之間的最短距離的問題;但dijkstra演算法要求所有邊的權值非負。看過prime演算法的同學都知道,dijkstra演算法與prime演算法很相似,不同的就是dis陣列的更新方式。dijkstra演算法用鄰接矩陣存圖比較方便。
【演算法思想】:先用乙個陣列記錄從源點到圖中個頂點直接相連的距離,如果不直接連,就記錄為無窮大,然後通過對該陣列的更新,使得dis[x]表示從源點到x的最短路徑;
如圖:有四個頂點,6條邊;求0到3直接的最短路徑?由圖得知是4,那麼,如何用**實現?1.1 初始化用鄰接矩陣來存圖,先進行初始化,自己到自己的距離初始化為0,到另外的頂點的距離初始化為無窮大。並將標記陣列都置為0,表示所有頂點都未訪問;
int mp[n]
[n];
//用鄰接矩陣來存圖;
int dis[n]
;//用了記錄源點到各頂點的距離;
int vis[n]
;//標記頂點是否訪問過;
void
inin
(int n)
//初始化;
}}
1.2 dijkstra主體
引數st表示源點,此題是0,n是頂點個數
第一步:先用dis陣列儲存與0直接相連的頂點之間的距離。並標記0號頂點;然後用乙個while死迴圈來變數所有頂點,最壞的情況就是遍歷所有頂點。
第二步:就是在當前的dis陣列裡找乙個頂點沒有訪問過且距離源點最近的點,記錄它的頂點下標;
第三步:更新dis陣列:如果x頂點沒有被訪問,並且0到x頂點的距離(直接或間接)大於上面dis陣列最小值加上點p到x點的距離,就對dis陣列更新:dis[x] = min + mp[p][x];
(可以理解為:從源點直接到某點的距離大於間接到某點的距離)
第四步:重複上面的第二步和第三步;
圖示:
第一步:此時的dis陣列:0 5 2 7;並標記源點0;此時的vis陣列:1 0 0 0
第二步:找到最小距離2,p = 2;然後標記2號結點;此時的vis陣列:1 0 1 0
第三步:更新dis陣列,更新後為:0 5 2 4;
第四步:重複上面的第二步和第三步,直到所有的頂點都被訪問;最後dis陣列為:0 5 2 4;vis陣列為:1 1 1 1
最後:完整**實現:
#include
using namespace std;
#define n 1000
#define inf 0x3f3f3f3f
int mp[n]
[n];
//用鄰接矩陣來存圖;
int dis[n]
;//用了記錄源點到各頂點的距離;
int vis[n]
;//標記頂點是否訪問過;
void
inin
(int n)
//初始化;}}
void
dijkstra
(int st,
int n)
//這裡的st是源點,和prime演算法中的st不同,這個不是任意的,而是根據題目要求的源點;
vis[st]=1
;//標記剛才源點,表示已經訪問;
while(1
)}vis[p]=1
;if(p ==-1
)//直到所有的頂點都已訪問過,結束迴圈,當然,這是最壞的情況,如果在不考慮時間的情況下,可以這麼寫;
break
;for
(i =
0; i < n; i++
)//更新dis陣列,}}
}int
main()
int p, q;
//求p到q之間的最短路徑;
cin >> p >> q;
dijkstra
(p,n)
; cout << dis[q]
<< endl;
return0;
}
輸入:4 60 1 5
0 2 2
0 3 7
1 3 1
1 2 6
2 3 2
0 3輸出:
0到3的最短路徑為:4
vis陣列:1 1 1 1
dis陣列:0 5 2 4
最短路徑 之Dijkstra演算法
dijkstra演算法dijkstra 鄰接矩陣 int n,e maxv maxv int dis maxv pre maxv pre用來標註當前結點的前乙個結點 bool vis maxv void dijkstra int s if u 1 return visit u true for in...
最短路徑 之Dijkstra演算法
dijkstra演算法 dijkstra 鄰接矩陣 int n,e maxv maxv int dis maxv pre maxv pre用來標註當前結點的前乙個結點 bool vis maxv void dijkstra int s if u 1 return visit u true for i...
最短路徑之Dijkstra演算法
using system namespace dijkstra演算法 路徑圖 static int places int math.sqrt map.length 獲取地點數 static int shortest new int places 存放從start到其他節點的最短路徑 static b...