簡單介紹:
最短路徑演算法是圖演算法中的經典演算法,是用於解決圖中某個頂點到另外乙個頂點所經過路徑的花銷最小(這裡的花銷可能是時間也可能指費用等)。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...