Dijkstra演算法與Floyed程式碼詳解
阿新 • • 發佈:2018-12-20
一:Dijkstra演算法
詳解程式碼
#define INF 0x3f3f3f struct node { int L,W; }Map[MAX][MAX];//用鄰接矩陣表示圖,圖中每個元素含兩個值L,W;L為路徑長度,W為收費情況 int visit[MAX]; int path[MAX]; //儲存路徑長度 int weight[MAX];//儲存收費情況 int Dijkstar(int n,int s,int d)//迪傑斯特拉演算法 { int k; for(int i=0;i<n;i++)//初始化 { path[i]=Map[s][i].L;//將與S點有連線的頂點初始化其路徑長度,即權值 weight[i]=Map[s][i].W;//將與0點有連線的頂點加上費用值,也看做權值 } path[s]=0; visit[s]=1; for(int i=1;i<n;i++)//開始主迴圈,每次求得s到某個n頂點的最短路徑 { int Min = INF; for(int j=0;j<n;j++) { if(!visit[j]&&path[j]<Min) { k=j; Min = path[j]; } } visit[k]=1;//將目前找到的最近的頂點置1 for(int i=0;i<n;i++)//修正當前路徑 { if(!visit[i]&&Map[k][i].L<INF) { if(path[k]+Map[k][i].L<path[i])//以當前點為起點尋找下一個最短路 { path[i]=path[k]+Map[k][i].L; weight[i]=weight[k]+Map[k][i].W; } else if(path[k]+Map[k][i].L==path[i])//若存在相同路徑,則比較相同路徑上費用和的大小,選擇小的存入weight陣列 { if(weight[k]+Map[k][i].W<weight[i]) { weight[i]=weight[k]+Map[k][i].W; } } } } } cout<<path[d]<<" "<<weight[d]; cout<<endl; return 0; }
二:Floyed演算法程式碼詳解
#define INF 0x3f3f3f struct node { int L,W; }Map[MAX][MAX]; int D[MAX][MAX];//儲存任意兩點間的最短路 int path[MAX][MAX];//儲存要到達頂點的前驅頂點 int weight[MAX][MAX];//儲存任意兩點間的最小費用 int Floyed(int n,int s,int d)//Floyed演算法求最短路 { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { D[i][j]=Map[i][j].L; weight[i][j]=Map[i][j].W; path[i][j]=-1; } } for(int k=0;k<n;k++) { for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if(D[i][j]>D[i][k]+D[k][j]) { D[i][j]=D[i][k]+D[k][j]; weight[i][j]=weight[i][k]+weight[k][j]; path[i][j]=k; } else if(D[i][j]==D[i][k]+D[k][j]) //若存在相同路徑,選擇費用較小的一條 { if(weight[i][j]>weight[i][k]+weight[k][j]) { weight[i][j]=weight[i][k]+weight[k][j]; path[i][j]=k; } } } } } cout<<D[s][d]<<" "<<weight[s][d]<<endl; return 0; }