/*
dijkstra演算法:
1.將所有的頂點分為兩部分:已知最短路程的頂點集合p和未知最短路徑的頂點集合q。
最開始,已知最短路徑的定點集合p中只有源點乙個頂點。用
visit陣列記錄哪些頂點在p中。
對於某個頂點i,如果
visit[i]為1則表示此頂點在p中,若visit[i]為0,則表示此頂點在集合q中
2.設定源點v到自己的最短路徑為0,即dis[v]=0。若存在源點能直接到達的頂點i,則把dis[i]設為e[v][i]
同時把所有其他(源點不能直接到達的)頂點的最短路徑設為inf(無窮大)
3.在集合q中所有的頂點中選擇乙個離源點v最近的頂點u(即dis[u]最小),加入到集合p。
並考察所有以u為起點的邊,對每一條邊進行鬆弛操作。
如果存在一條從u到s的邊,可以通過將邊u->s新增到尾部來拓展一條從v到s的路徑,這條路徑的長度是dis[u]+e[u][s].
如果這個值比目前已知的dis[s]的值要小,則可以用新值來替代當前dis[s]中的值。
4.重複第3步,直到集合q為空,演算法結束。最終dis陣列中的值就是源點到所有頂點的完整路徑。
#include#define maxnum 100
#define inf 999999
using namespace std;
void dijkstra(int n,int v,int *dis,int *prev,int c[maxnum][maxnum])
dis[v]=0;
visit[v]=1;
for(int i=2;i<=n;i++){
int min=inf;
int u=v;
//找出當前未使用點j的dis[j]最小值
for(int j=1;j<=n;j++)
if(!visit[j]&&dis[j]=1;i--){
if(i!=1)
cout<";
else
cout<>n;
cin>>m;
int p,q,w;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
c[i][j]=inf;
for(int i=1;i<=m;i++){
cin>>p>>q>>w;
if(w
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 簡...