一、對於每條邊僅鬆弛一次node
二、複雜度低於Bellmall-Fordc++
三、邊的權重爲非負值ide
四、時間複雜度O(V*lgV)測試
INITIALIZE-SINGLE-SOURCE(G,s)spa
for ecah vertex v屬於G.Vci
v.d=MAXINTit
v.prev=NULLclass
s.d=0集合
僞碼:di
DIJKSTRA(G,w,s)
INITIALIZE-SINGLE-SOURCE(G,s)
S=NULL
Q=G.V
while Q!=NULL
u=EXTRACT-MIN(Q)
S=S U {u}
for each vertex v屬於G.Adj[u]
RELAX(u,v,w)
c++實現:
namespace A{ int prev[100];//各個節點的前驅節點 int dist[100];//各個節點到源節點的最短距離 int c[100][100];//用臨接矩陣表示圖 bool s[100];//表示節點是否已經加入S集合 int nodenum;//節點個數 int line;//邊的條數 int startnode;//源節點 int src, dst, weight; const int MAXINT = 9999; void init() { cout << "輸入節點個數:"; cin >> nodenum; cout << "輸入邊的條數:"; cin >> line; cout << "輸入源節點編號:"; cin >> startnode; for (int i = 1; i <= nodenum; ++i){ for (int j = 1; j <= nodenum; ++j) c[i][j] = MAXINT; } cout << "輸入" << line << "行src dst wight:"; for (int i = 1; i <= line; ++i){ cin >> src >> dst >> weight; c[src][dst] = weight; //c[dst][src]=weight;//無向圖 } for (int i = 1; i <= nodenum; ++i){ dist[i] = c[startnode][i]; if (dist[i] == MAXINT) prev[i] = -1; else prev[i] = startnode; } dist[startnode] = 0; for (int i = 1; i <= nodenum; ++i){ s[i] = false; } s[startnode] = true; } void Dijkstra() { init(); int scount = 1; while (scount < nodenum){ int tmp = MAXINT; int u; for (int i = 1; i <= nodenum; ++i){ if (s[i] == false && dist[i] < tmp) { tmp = dist[i]; u = i; } } s[u] = true; for (int i = 1; i <= nodenum; ++i){ if (s[i] == false && c[u][i] < MAXINT&&c[u][i] + tmp < dist[i]){ dist[i] = c[u][i] + tmp; prev[i] = u; } } ++scount; } } }; int main() { A::Dijkstra(); for (int i = 1; i <= A::nodenum; ++i) cout << A::dist[i] << " "; cout << endl; system("pause"); return 0; }
測試用例:
5
7
1
1 2 10
1 4 30
1 5 100
2 3 50
3 5 10
4 3 20
4 5 60
《完》