最短路徑之Dijkstra演算法(鄰接矩陣實現)

2021-09-23 08:09:01 字數 2874 閱讀 8232

單源最短路徑:就是從某乙個頂點出發,到圖中任意頂點之間的最短路徑;

【演算法概述】: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...