一、问题描述:GDOU是真是一个好地方,校园如一座大花园,美丽而宽广。校园有许多建筑如教学楼、饭堂、宿舍楼、图书馆、体育馆、运动场、商业街、医院等,还有一些著名的风景点。现请根据学校的平面图,找出一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。请设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,请给出最佳路径,并输出路径相关信息。
二、问题分析:需要画出学校的平面图,并且要选取其中的重要地点,将实际问题转化为数据结构相关的知识点上来。因此,问题分析关键在于如何转化地图并运用合适的数据结构来解决问题。
三、逻辑结构和存储结构分析:
逻辑结构:很显然,该题目运用的逻辑结构是有向图。
注:各点之间的路径长度为估算,与现实可能会有差异,且路径可能有更多,这里简化了一些。
1、存储结构:
这里用邻接矩阵进行存储,定义有向图为:
int map[][9] = { //定义有向图
{0, 10, INT_MAX, INT_MAX, 5,5,INT_MAX,INT_MAX,INT_MAX},
{INT_MAX, 0, 1, INT_MAX, 2,INT_MAX,INT_MAX,5,9},
{INT_MAX, INT_MAX, 0, 4, INT_MAX,INT_MAX,INT_MAX,INT_MAX,7},
{7, INT_MAX, 6, 0, INT_MAX,2,5,INT_MAX,INT_MAX},
{INT_MAX, 3, 9, 2, 0,INT_MAX,INT_MAX,INT_MAX,INT_MAX},
{5,INT_MAX,INT_MAX,2,INT_MAX,0,INT_MAX,INT_MAX,INT_MAX}, {INT_MAX,INT_MAX,INT_MAX,5,INT_MAX,INT_MAX,0,INT_MAX,INT_MAX}, {INT_MAX,5,INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX,0,INT_MAX}, {INT_MAX,9,7,INT_MAX,INT_MAX,INT_MAX,INT_MAX,INT_MAX,0}};
当然还可以加上辅助数组来存放最短路径和最短路径长度。
四、算法设计:
运用Dijkstra 算法,又叫迪科斯彻算法(Dijkstra),算法解决的是有向图中单个源点到其他顶点的最短路径问题。
举例来说,如果图中的顶点表示城市,而边上的权重表示著城市间开车行经的距离,Dijkstra 算法可以用来找到两个城市之间的最短路径。它的实现如下:
Dijkstra 算法的输入包含了一个有权重的有向图 G,以及G中的一个来源顶点 S。我们以 V 表示 G 中所有顶点的集合,以 E 表示G 中所有边的集合。(u, v) 表示从顶点 u 到 v 有路径相连,而边的权重则由权重函数 w: E → [0, ∞] 定义。因此,w(u, v) 就是从顶点 u 到顶点 v 的非负花费值(cost),边的花费可以想像成两个顶点之间的距离。任两点间路径的花费值,就是该路径上所有边的花费值总和。已知有 V 中有顶点 s 及 t,Dijkstra 算法可以找到 s 到 t 的最低花费路径(例如,最短路径)。这个算法也可以在一个图中,找到从一个顶点 s 到任何其他顶点的最短路径。
五、时间复杂度