Dijkstra演算法
阿新 • • 發佈:2020-07-28
#include<iostream> #define INF 10000 //取合適的值作為無窮大表示無邊 using namespace std; int n=7; //頂點數 int G[7][7]= { {INF,9,INF,INF,INF,INF,INF}, {9,INF,12,5,INF,INF,7}, {INF,12,INF,6,INF,INF,INF}, {INF,5,6,INF,14,8,INF}, {INF,INF,INF,14,INF,3,INF}, {INF,INF,INF,8,3,INF,10}, {INF,7,INF,INF,INF,10,INF} }; //圖的鄰接矩陣 void Dijkstra(int v0) { int minCostPer[n],join[n];//minCostPer[]存的是各個節點到起點的路徑最小值 int minValue,path[n];//path[]存的最短路徑上,當前節點的前一個節點 int v=v0; for(int i=0; i<n; i++) { minCostPer[i]=G[v][i]; join[i]=0; if(G[v][i]<INF) { path[i]=v; } else { path[i]=-1; } } join[v]=1;//起點加入路徑 path[v]=-1;//起點沒有前一個節點,標記為-1 for(int i=0; i<n-1; i++) { minValue=INF; for(int j=0; j<n; j++) { if(join[j]==0&&minCostPer[j]<minValue) { minValue=minCostPer[j]; v=j; } } join[v]=1; for(int j=0; j<n; j++) { if(join[j]==0&&G[v][j]<INF&&minCostPer[v]+G[v][j]<minCostPer[j]) { minCostPer[j]=minCostPer[v]+G[v][j]; path[j]=v; } } } for(int i=0; i<n; i++) { cout<<minCostPer[i]<<" "; } } int main() { Dijkstra(0);//以符號標誌為0的節點作為起點 /* path[]裡的元素值應為:-1 0 3 1 5 3 1 minCostPer[]裡的元素值應為:10000 9 20 14 25 22 16 */ return 0; }