Dijkstra演算法,並記錄最短路徑

2021-09-17 23:01:02 字數 1280 閱讀 4612

//看**時需要提前理解的

//我們用乙個一維陣列怎麼儲存起點到其餘所有點的多條最短路徑

//我們只需要記錄起點s到某個節點n的最短路徑的最後乙個中間節點k

//找到k後在找到s到k的最短路徑的最後乙個中間節點l,如此反覆就可以找到路徑

//所以一條路徑只要記錄乙個點,乙個一維陣列就可以搞定了

#include

#include

#define max 100000

using namespace std;

void dijkstra(vector> &arcs,//鄰接矩陣 矩陣在函式外按演算法初始化 鄰接矩陣應該是對稱的

vector&dist,//儲存最短路徑的,初始化為-1,長度為節點個數

int start//這是起點,所有起點0開始編號,100個起點就是0-99,

//arcs[i]就是第i個起點到各個相鄰,注意只是給了相鄰起點的距離,arcs[i][i]==0

)//定義bool陣列 標誌該節點是否走過 並初始化為false

bool *cover_node=new bool[nm_length];

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

cover_node[i] = false;

//dist陣列是儲存路徑的 並初始化為-1

//int *dist = new int[nm_length];

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

//開始不斷找距離源點start最近的點距離

while(true)}}

//已經找到最小點了,如果發現min=max,可以退出 因為所有點都走過了

if (min == max)

break;

//如果找到最小節點發現為-1,證明他是由start直接走到的,則他最短路徑的最後乙個節點就是start

if (dist[min_index] == -1)

dist[min_index] = start;

//找到最小節點後要更新鄰接矩陣

for (int i_temp1 = 0; i_temp1 < nm_length; i_temp1++)

}//走過後要把最小點要標記為true

cover_node[min_index] = true;

}//最後arcs[start]一行就是到各點最短路徑

//根據dist就能找到最短路徑,當然這裡要你理解dist的儲存最短路徑方式你才能知道怎麼找

//如果還不理解就自己再看多幾次,拿筆畫畫

最短路 Dijkstra演算法

dijksitra演算法求最短路僅僅適用於不存在右邊是負權的情況 bellman ford演算法沒有這乙個限制 主要特點是從起點為中心向外層層擴充套件,直到擴充套件到終點為止。即乙個最短路路徑中經過的所有點這條路均是其最短路。反證法易證 dijkstra基本思路 找到最短距離已經確定的頂點,從它出發...

dijkstra最短路演算法

dijkstra演算法 1.定義概覽 dijkstra 迪傑斯特拉 演算法是典型的單源最短路徑演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。dijkstra演算法是很有代表性的最短路徑演算法,在很多專業課程中都作為基本內容有詳細的...

最短路 Dijkstra演算法

這是一類求單源最短路的演算法,也就是求某乙個頂點到其他所有頂點的最短路。它是按照最短路徑遞增的順序來計算的。先說一下大體思路 將圖中的頂點分為兩個集合,s,v s。s儲存已經求出最短路徑的頂點,v s儲存未求出最短路的頂點。然後演算法就是不斷額的求出v s中頂點的最短路,然後把它加入s中,直到所有頂...