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);}
迪傑斯特拉演算法
if object id t test is not null drop table t test gocreate table dbo t test id int identity 1,1 not null primary key,自增字段,無意義 header varchar 500 第一點的名...
迪傑斯特拉演算法
迪傑斯特拉演算法用來計算圖中某一點到其他點的最短距離,這個圖可以是加權,也可以是無權的,距離指的是從一點到其它點所經過的邊的權重和 假設現在有乙個加權無向圖,我們要求節點1到其他點的最短距離 初始化圖arr 用乙個鄰接矩陣來表示一張圖,矩陣元素 初始化一維向量d,這個向量儲存的是其他點的最短距離,初...
迪傑斯特拉演算法
dijkstra演算法 單源最短路徑 每次找到離源點最近的乙個頂點,然後以該頂點為中心進行擴充套件,最終得到源點到其餘所有點的最短路徑。1.把所有的頂點分為兩部分 已知最短路程的頂點集合p和未知最短路徑的頂點集合q。最開始,p集合中只有源點乙個頂點,用visit i 陣列來記錄哪些點在集合p。vis...