斯特拉演算法Dijkstra 迪傑斯特拉 演算法

2021-06-16 21:11:28 字數 2286 閱讀 3989

dijkstra(迪傑斯特拉)演算法是典型的最短路徑路由演算法,用於計算乙個節點到其他所有節點的最短路徑。主要特點是以起始點為中心向外層層擴充套件,直到擴充套件到終點為止。

dijkstra演算法

能得出最短路徑的最優解,但由於它遍歷計算的節點很多,所以效率低。

dijkstra演算法是很有代表性的最短路演算法,在很多專業課程中都作為基本內容有詳細的介紹,如資料結構,圖論,運籌學等等。

其基本思想是,設定頂點集合s並不斷地作貪心選擇來擴充這個集合。乙個頂點屬於集合s當且僅當從源到該頂點的最短路徑長度已知。

初始時,s中僅含有源。設u是g的某乙個頂點,把從源到u且中間只經過s中頂點的路稱為從源到u的特殊路徑,並用陣列dist記錄當前每個頂點所對應的最短特殊路徑長度。dijkstra演算法每次從v-s中取出具有最短特殊路長度的頂點u,將u新增到s中,同時對陣列dist作必要的修改。一旦s包含了所有v中頂點,dist就記錄了從源到所有其它頂點之間的最短路徑長度。

例如,對下圖中的有向圖,應用dijkstra演算法

計算從源頂點1到其它頂點間最短路徑的過程列在下表中。

dijkstra演算法的迭代過程:

主題好好理解上圖!

以下是具體的實現(c/c++):

/***************************************

* about:    有向圖的dijkstra演算法實現

* author:   tanky woo

* blog:     www.wutianqi.com

**************************************

*/#include 

<

iostream

>

using

namespace

std;

const

intmaxnum 

=100

;const

intmaxint 

=999999

;void

dijkstra(

intn, 

intv, 

int*

dist, 

int*

prev, 

intc[maxnum][maxnum])

dist[v] =0

;s[v] =1

;//依次將未放入s集合的結點中,取dist最小值的結點,放入結合s中

//一旦s包含了所有v中頂點,dist就記錄了從源點到所有其他頂點之間的最短路徑長度

for(

inti=2

; i<=

n; ++

i)s[u] =1

;    

//表示u點已存入s集合中

//更新dist

for(

intj=1

; j<=

n; ++

j)if((!

s[j]) 

&&c[u][j]

<

maxint)}}

}void

searchpath(

int*

prev,

intv, 

intu)

que[tot] =v;

for(

inti

=tot; i

>=1; 

--i)

if(i !=1

)cout 

<<

que[i] 

<<

"-> ";

else

cout 

<<

que[i] 

<<

endl;

}int

main()

}for

(inti=

1; i

<=

n; ++

i)dist[i] 

=maxint;

for(

inti=1

; i<=

n; ++

i)dijkstra(n, 

1, dist, prev, c);

//最短路徑長度

cout 

<<

"源點到最後乙個頂點的最短路徑長度: 

"<<

dist[n] 

<<

endl;

//路徑

cout 

<<

"源點到最後乙個頂點的路徑為: ";

searchpath(prev, 

1, n);

}

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演算法算是貪心思想實...