//看**時需要提前理解的
//我們用乙個一維陣列怎麼儲存起點到其餘所有點的多條最短路徑
//我們只需要記錄起點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中,直到所有頂...