資料結構第七次上機試驗——最短路徑
阿新 • • 發佈:2018-12-21
實驗內容與要求:
根據輸入的圖形,輸入起點和終點,求出最短路徑和最短路徑的長度。
具體步驟:
1. 編寫一段程式碼,接收鍵盤的輸入定點的數量,並以輸入的整數作為邊來建立圖形的鄰接矩陣(無向權重圖)。
例如:5 6 12
表示頂點5和頂點6之間有邊,邊的權重為12
2. 打印出鄰接矩陣。
3. 輸入起點和終點。
4. 列印最短路徑和最短路徑的長度。
樣例:資料測試
輸入:
1 3 5 1 4 30 2 1 2 3 2 15 3 6 7 5 4 4 6 4 10 6 5 18
打印出1,5兩點之間的最短距離和最短路徑
程式碼
#include<iostream> using namespace std; #define MaxInt 32767 #define MVnum 100 typedef int VextexType; typedef int ArcType; bool vis[MVnum]; int dis[MVnum]; int Path[MVnum]; int path[MVnum]; typedef struct{ ArcType arcs[MVnum][MVnum]; int vexnum,arcnum; }AMGraph; void CreateUDN(AMGraph &G){ cout<<"請輸入頂點數和邊數:"; cin>>G.vexnum>>G.arcnum; for(int i=1;i<=G.vexnum;i++) for(int j=1;j<=G.vexnum;j++) G.arcs[i][j]=MaxInt; cout<<"請輸入兩個頂點和邊的權值:"<<endl; int v1,v2,w; for(int i=1;i<=G.arcnum;i++){ cin>>v1>>v2>>w; G.arcs[v1][v2]=w; G.arcs[v2][v1]=w; } } void ShortestPath_DIJ(AMGraph G,int v0){ for(int i=1;i<=G.vexnum;i++){ vis[i]=0; dis[i]=G.arcs[v0][i]; if(dis[i]<MaxInt) Path[i]=v0; else Path[i]=-1; } vis[v0]=1; dis[v0]=0; for(int i=1;i<G.vexnum;i++){ int min=MaxInt,v; for(int j=1;j<=G.vexnum;j++) if(!vis[j]&&dis[j]<min){ v=j; min=dis[j]; } vis[v]=1; for(int j=1;j<=G.vexnum;j++) if(!vis[j]&&dis[v]+G.arcs[v][j]<dis[j]){ dis[j]=dis[v]+G.arcs[v][j]; Path[j]=v; } } } int main(){ AMGraph G; CreateUDN(G); int vst,ved,i,j;//v-start,v-end cout<<"請輸入起點和終點:"; cin>>vst>>ved; ShortestPath_DIJ(G,vst); cout<<"從"<<vst<<"到"<<ved<<"的最短路徑長度為"<<dis[ved]<<endl; cout<<"從"<<vst<<"到"<<ved<<"的最短路徑為"; for(i=0,j=Path[ved];j!=1;i++){ path[i]=j; j=Path[path[i]]; } cout<<vst; for(--i;i>=0;i--) cout<<"->"<<path[i]; cout<<"->"<<ved; return 0; }
結果
從1到5的最短路徑長度為26
從1到5的最短路徑為1->3->6->4->5