【問題描述】
在旅遊景區,經常會遇到遊客打聽從乙個景點到另乙個景點的最短路徑和最短距離,這類遊客不喜歡按照導遊圖的線路來遊覽,而是挑選自己感興趣的景點遊覽。為於幫助這類遊客資訊查詢,就需要計算出所有景點之間最短路徑和最短距離。演算法採用迪傑斯特拉演算法或弗洛伊德演算法均可。建立乙個景區旅遊資訊管理系統,實現的主要功能包括制訂旅遊景點導遊線路策略和制訂景區道路鋪設策略。
課程任務中景點分布是乙個無向帶權連通圖,圖中邊的權值是景點之間的距離。
(1)景區旅遊資訊管理系統中制訂旅遊景點導遊線路策略,首先通過遍歷景點,給出乙個入口景點,建立乙個導遊線路圖,導遊線路圖用有向圖表示。遍歷採用深度優先策略,這也比較符合遊客心理。
(2)為了使導遊線路圖能夠優化,可通過拓樸排序判斷圖中有無迴路,若有迴路,則列印輸出迴路中的景點,供人工優化。
(3)在導遊線路圖中,還為一些不願按線路走的遊客提供資訊服務,比如從乙個景點到另乙個景點的最短路徑和最短距離。在本線路圖中將輸出任意景點間的最短路徑和最短距離。
(4)在景區建設中,道路建設是其中乙個重要內容。道路建設首先要保證能連通所有景點,但又要花最小的代價,可以通過求最小生成樹來解決這個問題。本任務中假設修建道路的代價只與它的里程相關。
【基本要求】
本任務應有如下功能模組:
建立景區景點分布圖;
輸出景區景點分布圖(鄰接矩陣)
輸出導遊線路圖;
判斷導遊線路圖有無迴路;
求兩個景點間的最短路徑和最短距離;
輸出道路修建規劃圖。
主程式用選單選項供使用者選擇功能模組。
#include #include #include #include #include using namespace std ;const int max = 100 ;
const int inf = 0x3f3f3f;
// 景區旅遊資訊管理系統
typedef struct node
node;
typedef struct route
route; // 起點終點和距離 ;
typedef struct matgraph
matgraph; // 完整的圖鄰接矩陣型別
typedef struct node
bstnode;
typedef struct anode
arcnode ; // 邊節點的型別
typedef struct vnode
vnode; // 鄰接表的頭結點型別
typedef struct
adjgraph;
int vis[max] ;
int count1 ;
bstnode *mapvex[max] ; // 頂點
void creatematgragh(matgraph > ,int n , int pos, route gr[max][max])
else}}
for(int i = 1 ; i<= n; i++)
return ;
}void read(node place ,int n ,int e)
for(int i = 1 ; i<=n ; i++)
return ;
}void mattolist(matgraph g , adjgraph *&g)
for(int i = 1 ; i<= g.n ; i++)}}
g->n = g.n ;
g->e = g.e ;
return ;
}int dispadj(adjgraph *g )
printf(" ^ \n") ;
}return count;
}bstnode *searchbst(bstnode *bt , int k )
if(k < bt->infor.placenumber)
else
}void dfs(adjgraph *g , int v , node place ,bstnode *bt )
p = g->adjlist[v].firstarc ;
while(p!=null)
p = p->nextarc ;
}}void display(node place ,int n)
}void createmat(matgraph &map , int n , int e)
}map.n = n ;
map.e = e ;
for(int i = 1 ; i<=e ; i++)
return ;
}bool insertbst(bstnode *&bt , node k )
else if (k.placenumber == bt->infor.placenumber)
else if (k.placenumber < bt->infor.placenumber )
else if (k.placenumber > bt->infor.placenumber )
}bstnode *creatbst(node place , int n)
return bt ;
}void dijkstra(int start, int end, matgraph map,bstnode *bt)
else
}vis[start] = 1 ;
path[start] = 0 ;
for(int i = 1 ; idis[u] + map.map[u][v])}}
}}
bstnode *pfind1 ,*pfind2,*pfind3;
int pre ;
for(int i=1; i<=n; i++) //輸出結果和最短路徑
while(pre!=0) //繼續找前趨頂點
else
return ;}}
else
return ;
}void pageinfor()
int main()}}
else if (num == 4 )
}matgraph gt[20] ; // 導遊路線圖
for(int i = 1 ; i<=n ; i++)
creatematgragh(gt[i],n,i,gr) ;
// gt[1] 就是第乙個導遊路線(有向圖)
int number ;
int edgenum[max] ;
for(int k = 1 ; k <= n ; k++)}}
}for(int i = 1 ; i<=n ; i ++)
}cout<<" 最佳導遊路線 "if(i != n)
cout << " -> ";
}cout<> start ;
printf("輸入終點景點編號 \n") ;
cin >>end ;
int find_start_num = start;
int find_end_num = end;
pfind1 = searchbst(bt,find_start_num) ;//頂點
pfind2 = searchbst(bt,find_end_num) ; // 終點
if(!pfind1 && !pfind2)
return 0;
else
cout " if(find_start_num != -1 && find_end_num != -1)
else
cout << endl << endl;
}else if (num == 6 )
else if (num == 7 )
pageinfor() ;
}return 0 ;
}