1. 程式人生 > >Dijkstra算法

Dijkstra算法

ostream == ios sizeof com line a算法 www color

修改自:①http://www.61mon.com/index.php/archives/194/②http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html


簡介:

Dijkstra(迪傑斯特拉)算法是在圖論中是解決單源最短路問題的效率較高的算法。主要特點是以起始點為中心向外層層擴展,直到擴展到終點為止。(註意:當圖中存在負圈時,不能用此算法,可以用Bellman-Ford算法)

算法步驟:

a.初始時,S只包含源點,即S={v},v的距離為0。U包含除v外的其他頂點,即:U={其余頂點},若v與U中頂點u有邊,則<u,v>正常有權值,若u不是v的出邊鄰接點,則<u,v>權值為∞。

b.從U中選取一個距離v最小的頂點k,把k,加入S中(該選定的距離就是v到k的最短路徑長度)。

c.以k為新考慮的中間點,在標記數組中標記該點,修改U中各頂點的距離;若從源點v到頂點u的距離(經過頂點k)比原來距離(不經過頂點k)短,則修改頂點u的距離值,修改後的距離值的頂點k的距離加上邊上的權。

d.重復步驟b和c,計算沒有被標記的點,直到所有頂點都包含在S中。

代碼實現

#include <iostream>
#include <string.h>
#define INT_MAX 1000000000
int vertex_num;//頂點數
int arc_num;//弧數
int source;//
源點 bool visited[100];//標記數組 int dist[100];//源點到j的距離 int path[100];//記錄路徑 int matrix[100][100];//u點,v點之間的權值 using namespace std; void dijkstra(int source); int main() { cout << "請輸入圖的頂點數(<100):"; cin >> vertex_num; cout << "請輸入圖的弧數:"; cin >> arc_num; for (int i = 0; i < vertex_num; i++)
for (int j = 0; j < vertex_num; j++) matrix[i][j] = INT_MAX; //初始化matrix數組 cout << "請輸入u,v兩點之間的權值:\n"; int u, v, w; for (int i = 0; i < arc_num; i++) { cin >> u >> v >> w; matrix[u][v] = matrix[v][u] = w; } cout << "請輸入源點(<" << vertex_num << "):"; cin >> source; dijkstra(source); for (int i = 0; i < vertex_num; i++) { if (i != source) { cout << source << "" << i << "最短距離是:" << dist[i] << ",路徑是:" << i; int t = path[i]; while (t != source) { cout << "--" << t; t = path[t]; } cout << "--" << source << endl; } } return 0; } void dijkstra(int source){ memset(visited,0,sizeof(visited)); visited[source]=true; for(int i=0;i<vertex_num;i++){ dist[i]=matrix[source][i];//matrix在main裏輸入了u,v兩個點間的距離 path[i]=source; } int min_cost;//最小權值 int min_cost_index; for(int i=1;i<vertex_num;i++){//找到源點和其他幾個點的路徑 min_cost=INT_MAX; for(int j=0;j<vertex_num;j++){//找到距離源點最近的點 if(visited[j]==false&&dist[j]<min_cost){ min_cost=dist[j]; min_cost_index=j; } } visited[min_cost_index]=true; for(int j=0;j<vertex_num;j++){//源點變成min_cost_index了所以要更新dist if(visited[j]==false&& matrix[min_cost_index][j]!=INT_MAX&&//在mian裏全部初始化為了INT_MAX matrix[min_cost_index][j]+min_cost<dist[j]){ dist[j]=matrix[min_cost_index][j]+min_cost;//如果這條新路徑的距離比j點到上一個源點的距離小就更新 path[j]=min_cost_index;//更新路徑 } } } }

如果還有疑問,可以跟著這位大佬的栗子過一遍應該就沒問題了①http://www.61mon.com/index.php/archives/194/

Dijkstra算法