数据结构设计

一、问题描述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 到任何其他顶点的最短路径。

五、时间复杂度

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值