給定有向網圖g=(v,e)和源點v∈v,求從v到g中其餘各項點的最短路徑。
基本思想:將頂點集合v分成兩個集合,一類是生長點的集合s,包括源點和已經確定的最短路徑的頂點,另一類是非生長點的集合v-s,包括所有尚未確定最短路徑的頂點,並使用乙個待定路徑表,儲存從當前源點v到每個非生長點v的最短路徑。初始時,s只包含源點v,對vi∈v-s,待定路徑表為從源點v到vi的有向邊。然後在待定路徑表中找到當前最短路徑v……vk,將vk加入集合s中,對vi∈v-s,將路徑v……vk vi與待定路徑表中從源點v到vi的最短路徑相比較,取路徑長度較小者為當前最短路徑。重複上述過程,直到集合v中全部頂點加入到集合s中。時間複雜度:o(n^2)
**:
#include using namespace std;
const int maxsize = 10; //圖中最多頂點個數
template
class mgraph
; //析構函式
void dijkstra(int v);
private:
int min(int r[ ], int n);
datatype vertex[maxsize]; //存放圖中頂點的陣列
int edge[maxsize][maxsize]; //存放圖中邊的陣列
int vertexnum, edgenum; //圖的頂點數和邊數
};template
mgraph :: mgraph(datatype a[ ], int n, int e)
}template
void mgraph :: dijkstra(int v) //從源點v出發
for (num = 1; num < vertexnum; num++)
dist[k] = 0; //將頂點k加到集合s中}}
template
int mgraph ::min(int r[ ], int n)
return index;
}int main( )
; /* 測試資料使用 圖6-20(b),輸入邊七條邊是:
(0 1 10)(0 4 100)(0 3 30)(1 2 50)(2 4 10)(3 2 20)(3 4 60) */
mgraph mg; //建立具有5個頂點6條邊的無向圖
mg.dijkstra(0);
return 0;
}
最短路徑 之Dijkstra演算法
dijkstra演算法dijkstra 鄰接矩陣 int n,e maxv maxv int dis maxv pre maxv pre用來標註當前結點的前乙個結點 bool vis maxv void dijkstra int s if u 1 return visit u true for in...
最短路徑 之Dijkstra演算法
dijkstra演算法 dijkstra 鄰接矩陣 int n,e maxv maxv int dis maxv pre maxv pre用來標註當前結點的前乙個結點 bool vis maxv void dijkstra int s if u 1 return visit u true for i...
最短路徑之Dijkstra演算法
using system namespace dijkstra演算法 路徑圖 static int places int math.sqrt map.length 獲取地點數 static int shortest new int places 存放從start到其他節點的最短路徑 static b...