如果要了解過程
關於路徑儲存方法
演算法思想:
首先了解這是乙個不可以求負權的單源最短路徑演算法,以貪心的思想,每次尋找乙個距離源點最近且沒有標記過的節點,然後標記(注意自己到自己的距離置為0),對該節點進行鬆弛操作,如果可以進行,就儲存路徑(要求路徑的話),最後用棧還原路徑
題目:wust oj上的一題:1868
time limit: 1 sec
memory limit: 128 mb
64bit io format: %lld
submitted: 23
accepted: 19 [
submit][
status][
web board]
有n個城市(編號從1到n),個城市之間都有路連線,切這些路都是單向的。每條路都有相應的長度。各城市之間構成的路網不可能構成環狀。沒有一條路到達城市1,所有城市都能夠到達城市n。城市n不能到達其它任何城市。
第一行包含乙個整數n,表示城市數目。
接下來包含n行,每行n個整數。第i行第j列的整數a[i][j]表示城市i和城市j的路徑長度。
10
0 2 5 1 0 0 0 0 0 0
0 0 0 0 12 14 0 0 0 0
0 0 0 0 6 10 4 0 0 0
0 0 0 0 13 12 11 0 0 0
0 0 0 0 0 0 0 3 9 0
0 0 0 0 0 0 0 6 5 0
0 0 0 0 0 0 0 0 10 0
0 0 0 0 0 0 0 0 0 5
0 0 0 0 0 0 0 0 0 2
0 0 0 0 0 0 0 0 0 0
第一行輸出最短路徑長度,形如minlong=最短路徑長度值「」。
接下來的一行輸出從第1個城市到第n個城市的最短路徑上的所有城市。(詳見樣例)
minlong=19
1 3 5 8 10
**:
#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;
int p[105][105],path[105];
int dis[105],vis[105],n;
const int inf=1008611;
void init()
vis[i]=0;//判斷是否遍歷該節點的陣列
path[i]=-1;//前繼節點初始為-1
}}void dj()
dis[1]=0;
for(i=1;i<=n;i++)
}vis[key]=1;//標記
for(j=1;j<=n;j++)
q.push(i);
while(!q.empty())
printf("\n");
}int main()
return 0;
}
Dijkstra(迪傑斯特拉)演算法
迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。指定乙個節點,例如我們要計算 a 到其他節點的最短路徑 引入兩個集合 s u s集合包含已求出的最短路徑的點 以及相...
dijkstra迪傑斯特拉演算法
注意 1.標頭檔案climits的int max,加上2整數會溢位,每次相加前得判斷被加值是否為int max,int max 10為負數 2.得先初始化再對d s c s g,cost等賦值 fill d 0 d 0 max,int max fill g 0 0 g 0 0 max max,int...
迪傑斯特拉 Dijkstra 演算法
迪傑斯特拉 dijkstra 演算法是典型最短路徑演算法,用於計算乙個節點到其他節點的最短路徑。它的主要特點是以起始點為中心向外層層擴充套件 廣度優先搜尋思想 直到擴充套件到終點為止。通過dijkstra計算圖g中的最短路徑時,需要指定起點s 即從頂點s開始計算 dijkstra演算法算是貪心思想實...