1. 程式人生 > >資料結構第七次上機試驗——最短路徑

資料結構第七次上機試驗——最短路徑

實驗內容與要求:

       根據輸入的圖形,輸入起點和終點,求出最短路徑和最短路徑的長度。

具體步驟:

       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