dijkstra演算法中設定了一頂點集合s,從源點s到集合中的頂點的最終最短路徑的權值均已確定。演算法反覆選擇具有最短
路徑估計的頂點u∈v - s,並將u加入s中,對u的所有出邊進行鬆弛,在下列演算法實現中,用到了頂點的最小優先佇列
q,排序關鍵字為頂點的d值。d為實時權值。
**如下:
[cpp]view plain
copy
#include
#include
using
namespace
std;
#define maxvalue 10000 //定義乙個最長路徑
//此處dijkstra演算法的圖為有向圖
struct
edge
; struct
vertex
; struct
graph
; class
mswdijkstra
; mswdijkstra::mswdijkstra(char
*vertex,
intvernum,
char
adj[2],
int*weight,
intadjnum)
for(i = 0;i
} void
mswdijkstra::dijkstrainsert(
intsource,
intdest,
intweight)
else
edge* newnode = new
edge;
newnode->verno = dest;
newnode->weight = weight;
newnode->next = temp->next;
temp->next = newnode;
} }
intmswdijkstra::dijkstrafindkey(
char
key)
return
i;
} int
mswdijkstra::dijkstraextramin(
bool
*visited,
intlength)
} return
min;
} void
mswdijkstra::dijkstrainitsinglesource()
} void
mswdijkstra::dijkstramsw(
char
sourcekey)
dijkstrainitsinglesource();
shortway[source] = 0;
while
(count <= vernum)
sourceedge = sourceedge->next;
} }
delete
visited;
} void
mswdijkstra::dijkstraoutput()
while
(parent[j] != j);
cout
cout<
route.pop_front();
while
(!route.empty())
cout<
<
} }
intmain()
; int
vernum = 5;
char
adj[2] = ,,,,,,,,,};
intweight = ;
intadjnum = 10;
mswdijkstra *dijkstra = new
mswdijkstra(vertex,vernum,adj,weight,adjnum);
dijkstra->dijkstramsw('s'
);
dijkstra->dijkstraoutput();
return
0;
} 結果如下:
[cpp]view plain
copy
all the most shortest route from source :
s---s 0
s---y---t 8
s---y---t---x 9
s---y 5
s---y---z 7
請按任意鍵繼續. . .
Dijkstra 單源最短路徑
演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...
Dijkstra 單源最短路徑
演算法思想 輔助陣列dis i 表示當前源頂點到i的最短路徑。dis i 在程式未結束前,類似於動態規劃,可更新以取得最小值 陣列path用來記錄路徑 首先初始化令dis i 為edge v0 i v0為源頂點 然後選擇離源頂點最小的路徑,加入到構造最短路徑的點集合中,然後看是否可以更新dis i ...
Dijkstra單源最短路徑
dijkstra單源最短路徑 給定乙個帶權有向圖g v,e 其中每條邊的權是乙個非負實數。另外,還給定 v 中的乙個頂點,稱為源。現在我們要計算從源到所有其他各頂點的最短路徑長度。這裡的長度是指路上各邊權之和。這個問題通常稱為單源最短路徑問題。下面給出兩個計算單源最短路徑的模板。dijkstra 簡...