Dijkstra 迪傑斯特拉 演算法學習

2021-08-02 00:05:42 字數 1578 閱讀 9068

如果要了解過程 

關於路徑儲存方法 

演算法思想:

首先了解這是乙個不可以求負權的單源最短路徑演算法,以貪心的思想,每次尋找乙個距離源點最近且沒有標記過的節點,然後標記(注意自己到自己的距離置為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演算法算是貪心思想實...