單源最短路徑演算法

2021-08-09 14:59:32 字數 1298 閱讀 1269

簡單介紹:

最短路徑演算法是圖演算法中的經典演算法,是用於解決圖中某個頂點到另外乙個頂點所經過路徑的花銷最小(這裡的花銷可能是時間也可能指費用等)。dijkstra是用於解決單源最短路徑的經典演算法。

圖的儲存方式

鄰接矩陣

在鄰接矩陣中,要獲取某個結點的出度和入讀,是通過掃瞄結點所在臨界矩陣中的行列完成的。

鄰接表

在鄰接表中,鄰接點是通過掃瞄所在結點的鍊錶完成的。

dijkstra演算法介紹

dijkstra演算法通過不斷的將結點加入待訪問集合,和每次訪問結點後,對待訪問集合中的結點距離進行更新來求得最短路徑。

具體演算法過程如下:

1. 初始化邊圖(可以用鄰接矩陣或鄰接表表示)

2. 初始化待訪問集合dist(儲存源點到某個點的最短路徑權值)

3. 將源點加入待訪問集合

4. 遍歷待訪問集合找到還沒被訪問的值最小的結點

5. 不能找到的話代表所有結點都已訪問完畢,結束。能找到的話,將找到的結點標記為已訪問,並將該結點的鄰接點都加入訪問集合,再加入鄰接點的過程中,判斷是否要加入的鄰接點已經存在,如果存在,判斷是否通過當前路徑到達能夠得到更短的路徑,可以的話,更新dist。

6. 重複第4步

**演示

public

class dijkstra

public

static

void

main(string args)

//初始化邊

for (int i = 0; i < m; i++)

int dist = new

int[n];

//用於記錄經過的路徑

int path = new

int[n];

for (int i = 0; i < n; i++)

dist[0] = 0;

dijkstra(g, n, dist, path);

system.out.println(arrays.tostring(dist));

system.out.println(arrays.tostring(path));

}public

static

void

dijkstra(list g, int n, int dist, int path) }}

if(v == -1) break;

visited[v] = true;

for (int i = 0; i < g[v].size(); i++) }}

}}

}

單源最短路徑

include define max 999 define maxverts 10 typedef struct graph void chushi graph g void dij graph int key,int int int main for i 1 i g.numverts i dij ...

單源最短路徑

最優子結構 最短路徑的子路徑也是最短路徑,動態規劃和貪心演算法的乙個重要指標。環路 一條最短路徑不可能包含環路 1 環路權重為負,如果有一條環路權重為負,則不存在最短路徑 2 環路權重為零,如果包含該環路,則將該環路去掉即可 3 環路權重為正,去掉改環路可以得到更短的路徑,因此不可能是最短路徑 最短...

單源最短路徑

單源最短路徑問題,即在圖中求出給定頂點到其他任一頂點的最短路徑。1.最短路徑的最優子結構性質 該性質描述為 如果p i,j 是從頂點i到j的最短路徑,k和s是這條路徑上的乙個中間頂點,那麼p k,s 必定是從k到s的最短路徑。證明 假設p i,j 是從頂點i到j的最短路徑,則有p i,j p i,k...