数据结构+课程设计+校园最短路径问题

合集下载

校园最短路径的设计方案

校园最短路径的设计方案

学生会组织机构管理问题的设计方案1.问题描述图的最短路径问题是指从指定的某一点v开始,求得从该地点到图中其它各地点的最短路径。

并且给出求得的最短路径的长度及途径的地点。

除了完成最短路径的求解外,还能对该图进行修改,如顶点以及边的增删、边上权值的修改等。

校园最短路径问题中的数据元素有:(1)顶点数(2)边数(3)边的长度2.功能需求要求完成以下功能:(1) 输出顶点信息:将校园内各位置输出。

(2)输出边的信息:将校园内每两个位置(若两个位置之间有直接路径)的距离输出。

(3) 修改:修改两个位置(若两个位置之间有直接路径)的距离,并重新输出每两个位置(若两个位置之间有直接路径)的距离;(4) 求最短路径:输出给定两点之间的最短路径的长度及途经的地点或输出任意一点与其他各点的最短路径。

(5)删除:删除任意一条边。

(6)插入:插入任意一条边。

3.实现要点(1)对图的创建采用邻接矩阵的存储结构,而且对图的操作设计成了模板类。

为了便于处理,对于图中的每一个顶点和每一条边均设置了初值。

(2)为了便于访问,用户可以先输出所有的地点及距离。

(3)用户可以随意修改任意两点之间的距离。

(4)用户可以任意增加及删除边。

(5)当用户操作错误时,系统会出现出错提示。

4.类定义为构建图及最短路径建立了图的类,其类定义如下:const int MaxSize=8; //图中最多顶点个数class Graph{public:Graph(int* a, string* v,int n ); //构造函数,初始化具有n个顶点的图~Graph( ) { } //析构函数void Dijkstra( int v,int endv); //最小距离void PutOutVexInfo(); //取顶点信息 void PutOutArcInfo(); //输出路径void SetArc(int v1,int v2,int arclength); //修改路径 void DeleteVex(int pos); //删除顶点pos的信息void InsertVex(int num,string name); //在num的位置上插入一顶点,值为nameprivate:string vertex[MaxSize]; //存放图中顶点的数组int arc[MaxSize][MaxSize]; //存放图中边的数组int vertexNum, arcNum; //图的顶点数和边数};在图的类中,提供了如下成员函数:⑴函数声明:Graph完成的功能:构造函数,初始化具有n个顶点的图⑵函数声明:void Dijkstra完成的功能:求最短距离(3)函数声明:PutOutVexInfo完成的功能:取顶点信息(4)函数声明:PutOutArcInfo完成的功能:取边信息(5)函数声明:SetArc完成的功能:修改路径(6)函数声明:DeleteVex完成的功能:删除某顶点的信息(7)函数声明:InsertVex完成的功能:插入某个顶点(1)开始界面(2)输出顶点信息(3)输出边的信息(3)修改(4)求最短路径(5)删除某一顶点(6)插入某一顶点(7)删除某条边(8)插入某条边(9)退出。

数据结构第19讲_关键路径与最短路径_C

数据结构第19讲_关键路径与最短路径_C

数据结构第19讲_关键路径与最短路径_C 在数据结构的学习过程中,我们经常会遇到需要寻找最短路径的问题。

最短路径问题是指在图中寻找连接两个顶点之间最短路线的问题。

在实际生活中,最短路径问题广泛应用于交通、通信等领域。

在本篇文章中,我们将介绍关键路径和最短路径的概念,以及它们在实际问题中的应用。

首先,让我们来介绍关键路径。

关键路径是指在项目管理中,连接起始点和终止点的最长路径,也是项目完成所需要的最短时间。

关键路径可以通过计算活动的最早开始时间(EST)和最晚开始时间(LST)来确定。

活动的EST是指在没有任何限制条件下,活动可以最早开始的时间;而LST则是指在不影响项目完成时间的前提下,活动可以最晚开始的时间。

关键路径的长度等于项目的最早完成时间和最晚完成时间相等的活动的持续时间之和。

通过确定关键路径,我们可以优化项目进度,提高项目的整体效率。

接下来,让我们来介绍最短路径。

最短路径是指在图中寻找连接两个顶点之间最短路线的问题。

最短路径可以通过使用一些经典的算法来解决,例如迪杰斯特拉算法和弗洛伊德算法。

迪杰斯特拉算法是一种贪心算法,通过计算出从起点到其他顶点的最短路径,然后逐步扩展路径长度来逐步求解最短路径问题。

弗洛伊德算法是一种动态规划算法,通过构建一个关于各个顶点之间最短路径长度的矩阵来求解最短路径问题。

最短路径问题在实际生活中具有广泛应用,例如在地图导航中,我们需要找到从起点到目的地的最短路线;在网络通信中,我们需要找到网络中两个节点之间传输数据的最短路径。

在本篇文章中,我们介绍了关键路径和最短路径的概念,以及它们在实际问题中的应用。

关键路径用于确定项目完成所需的最短时间,而最短路径用于寻找连接两个顶点之间最短路线的问题。

这些概念都是数据结构中的重要内容,对于我们理解和解决实际问题具有重要意义。

校园导航数据结构课程设计

校园导航数据结构课程设计

校园导航数据结构课程设计一、课程目标知识目标:1. 理解并掌握数据结构中图的基本概念,包括节点、边、路径等;2. 学习并掌握图的表示方法,如邻接矩阵和邻接表;3. 了解并掌握图的遍历算法,如深度优先搜索(DFS)和广度优先搜索(BFS);4. 学会运用图的相关算法解决校园导航问题。

技能目标:1. 能够运用所学知识构建校园导航系统的数据结构模型;2. 培养学生的编程能力,使其能够独立编写实现图的遍历算法的程序;3. 提高学生解决实际问题的能力,使其能够将图论知识应用于校园导航问题。

情感态度价值观目标:1. 培养学生对数据结构学科的兴趣,激发其学习热情;2. 培养学生的团队协作意识,使其在合作中共同解决问题;3. 引导学生关注校园环境,提高其社会责任感。

课程性质:本课程为高中年级数据结构课程的一部分,侧重于图论知识在实际问题中的应用。

学生特点:高中年级的学生已经具备了一定的编程基础和数学逻辑思维能力,对于解决实际问题的兴趣较为浓厚。

教学要求:结合学生特点,通过讲解、实践和讨论等方式,使学生掌握图论知识,并能够将其应用于解决校园导航问题。

同时,注重培养学生的团队协作能力和实际操作能力,提高其综合运用知识解决问题的能力。

在教学过程中,关注学生的学习进度和反馈,及时调整教学策略,确保课程目标的实现。

二、教学内容1. 图的基本概念- 节点、边、路径、连通图、有向图等基本概念介绍- 图的应用场景,以校园导航为例2. 图的表示方法- 邻接矩阵及其性质- 邻接表及其实现3. 图的遍历算法- 深度优先搜索(DFS)算法原理与实现- 广度优先搜索(BFS)算法原理与实现4. 校园导航问题解决方案- 基于图的校园导航系统设计- 最短路径算法,如迪杰斯特拉(Dijkstra)算法介绍5. 教学实践- 编程实现图的遍历算法- 团队合作,设计并实现校园导航系统教学内容安排和进度:第一课时:图的的基本概念及表示方法第二课时:图的遍历算法原理与实现第三课时:最短路径算法介绍第四课时:教学实践,团队合作完成校园导航系统设计教材章节关联:本教学内容与教材中关于图论知识的章节相关,主要包括图的基本概念、图的表示方法、图的遍历算法等部分。

数据结构中最短路径的定义

数据结构中最短路径的定义

数据结构中最短路径的定义一、引言数据结构中最短路径是指在图论中,从一个起点到终点的最短路径。

在实际应用中,最短路径问题非常重要,例如在地图导航、网络路由等领域都有广泛的应用。

二、基本概念1. 图:图是由一组节点和一组边组成的数据结构,其中每个节点代表一个实体,每条边代表两个实体之间的关系。

2. 权重:在带权图中,每条边都有一个权值表示这条边所代表的实体之间的距离或者花费。

3. 路径:从一个节点到另一个节点经过的所有边和节点组成的序列称为路径。

4. 最短路径:从起点到终点经过所有路径中权值最小的那条路径称为最短路径。

三、算法分类1. 单源最短路径算法:从给定起点开始,计算出该起点到其他所有节点的最短路径。

2. 多源最短路径算法:计算出任意两个节点之间的最短路径。

四、常见算法1. Dijkstra算法:单源最短路径算法。

通过递推求解从起点到其他所有节点的最短距离,并记录下每个节点在当前已知情况下的最短路径。

2. Bellman-Ford算法:单源最短路径算法。

通过松弛操作来逐步缩小起点到其他节点的距离范围,直到求出所有节点的最短距离。

3. Floyd算法:多源最短路径算法。

通过动态规划求解任意两个节点之间的最短路径。

五、应用举例1. 地图导航:在地图中,每个城市可以看做一个节点,每条道路可以看做一条边,并赋予相应的权值(如距离或时间)。

通过最短路径算法可以找到从起点到终点的最短路线。

2. 网络路由:在计算机网络中,每个路由器可以看做一个节点,每条连接两个路由器的链路可以看做一条边,并赋予相应的权值(如延迟或带宽)。

通过最短路径算法可以找到从源主机到目标主机的最优路径。

六、结论数据结构中最短路径是一个重要问题,在实际应用中有广泛的应用。

常见的算法有Dijkstra、Bellman-Ford和Floyd等。

在地图导航和网络路由等领域都有广泛应用。

数据结构最短路径算法

数据结构最短路径算法

数据结构最短路径算法数据结构是计算机科学中非常重要的概念之一,它涉及到了组织和管理数据的方法和原则。

数据结构为我们提供了一种组织和存储数据的方式,以便于在算法中使用和操作数据。

在实际的计算机应用中,我们经常需要在图、网络、地图等复杂结构中找到最短路径。

因此,设计高效的最短路径算法是数据结构中一个重要的问题。

最短路径算法是一种计算从一个节点到另一个节点最短路径的方法。

最短路径算法的应用非常广泛,例如,在网络路由中,一个路由器需要找到从源节点到目标节点的最短路径,以便将数据包转发到目标节点;在地图导航中,我们需要找到从出发地到目的地的最短路径,以便为用户提供最佳的导航方案。

最短路径算法有许多不同的实现方法,每种方法都基于不同的数据结构和算法原理。

下面介绍几种常见的最短路径算法以及它们使用的数据结构。

1. Dijkstra算法:Dijkstra算法是最常用的最短路径算法之一、它基于图的广度优先(BFS)和贪心算法的思想,用于计算一个节点到所有其他节点的最短路径。

Dijkstra算法使用优先队列数据结构来维护每个节点的最短路径估计值,并根据估计值进行节点的选择和更新。

该算法的时间复杂度为O((V+E)logV),其中V是节点数量,E是边数量。

2. Bellman-Ford算法:Bellman-Ford算法是另一种常见的最短路径算法。

它基于图的深度优先(DFS)和动态规划的思想,可以处理有负权边的图。

Bellman-Ford算法使用一个一维数组来保存每个节点的最短路径估计值,并使用松弛(relax)操作来更新节点的最短路径。

它的时间复杂度为O(VE),其中V是节点数量,E是边数量。

3. Floyd-Warshall算法:Floyd-Warshall算法是一种用于计算所有节点对之间最短路径的算法。

它基于动态规划的思想,适用于有向图和无向图的最短路径问题。

Floyd-Warshall算法使用一个二维数组来保存任意两个节点之间的最短路径,并通过计算中间节点,逐步更新最短路径。

数据结构最短路径课设报告

数据结构最短路径课设报告

数据结构与算法课程设计报告书题目:导航最短路径查询班级:11101111学号:**********姓名:教师周期:2012.12.17-2012.12.21 (以下由验收教师填写)成绩:2012年12月21日《导航最短路径查询》一、课程设计的目的与要求(一)课程设计目的与任务通过学习,了解并初步掌握设计、实现较大系统的完整过程,包括系统分析、编码设计、编码集成以及调试分析,熟练掌握数据结构的选择、设计、实现、以及操作方法,为进一步的开发应用打好基础。

(二)题目要求要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。

同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。

二、设计正文1、系统分析和开发背景该程序所做的工作是给司机们提供最佳路线,来提高能源和时间的合理利用。

(1)把城市交通线路转化为图,从而对图进行相应的结构存储;(2)程序的输出信息主要为:起始城市到目的城市的最短路路径。

(3)程序的功能主要包括:城市之间路径的存储,最短路径的计算,以及最短路径和邻接矩阵的输出;2 、功能详细描述先假设有四个城市甲乙丙丁,甲乙相距2千米,且只有从乙到甲的单程线路。

甲丙相距7千米,且只有从甲到丙的单程线路。

甲丁相距4千米,且只有从甲到丁的单程线路。

乙丙相距5千米,且只有从丙到乙的单程线路。

乙丁相距3千米,且只有从丁到乙的单程线路。

丙丁相距3千米,且只有从丁到丙的单程线路。

戊甲相距6千米,且只有从戊到甲的单程线路。

戊丁相距2千米,且只有从丁到戊的单程线路。

乙己相距8千米,且只有从乙到己的单程线路。

丙己相距6千米,且只有从己到丙单程线路。

编程出能求出个一点到任一点的最短路经。

3、数据结构设计(1)typedef struct{int no; //顶点编号InfoType info; //顶点其他信息,这里用于存放边的权值}VertexType; //顶点类型typedef struct //图的定义{int edges[MAXV][MAXV]; //邻接矩阵int n,e; //顶点数,弧数VertexType vexs[MAXV]; //存放顶点信息}MGraph; //图的邻接矩阵类型//以下定义邻接表类型typedef struct ANode //弧的结点结构类型{int adjvex; //该弧的终点位置struct ANode *nextarc; //指向下一个弧的指针InfoType info; //该弧的相关信息,这里用于存放权值}ArcNode;typedef int Vertex;typedef struct Vnode //邻接表头结点的类型{Vertex data; //顶点信息ArcNode *firstarc[MAXV]; //指向第一条弧}VNode;typedef VNode AdjList[MAXV];//AdjList是邻接表类型typedef struct{AdjList adjlist; //邻接表int n,e; //图中顶点数n和边数e}ALGraph; //图的邻接表类型4、主要功能逻辑过程和实现算法用到的主要函数:(1)void DispMat(MGraph g) //输出邻接矩阵(2)void ppath(int path[][MAXV],int v,int endv) //输出相应选择的起点和终点的最短路。

数据结构第19讲关键路径与最短路径

数据结构第19讲关键路径与最短路径

数据结构第19讲关键路径与最短路径关键路径与最短路径是数据结构中非常重要的概念和算法。

它们在许多领域中都有广泛的应用,包括项目管理、网络通信、物流运输等等。

本文将介绍关键路径和最短路径的概念、算法以及它们的应用。

一、关键路径关键路径是指在一个项目中,所有活动中最长的路径,也即完成整个项目所需的最长时间。

关键路径的长度决定了项目的最短完成时间,因此对于项目管理非常重要。

关键路径的计算通常使用网络图来表示项目的各个活动以及它们的前后关系。

在网络图中,每个活动用一个节点表示,活动之间的关系用边来表示。

活动之间的关系可以分为两种:顺序关系和并行关系。

1.顺序关系:活动A必须在活动B之前完成,这种关系用有向边表示。

2.并行关系:活动A和活动B可以同时进行,这种关系用无向边表示。

关键路径算法通过在网络图上进行正向遍历和逆向遍历来计算关键路径。

具体步骤如下:1.正向遍历:从起始节点出发,计算每个节点的最早开始时间。

最早开始时间是指在没有任何延迟的情况下,从起始节点到达该节点所需的最短时间。

2.逆向遍历:从终点节点出发,计算每个节点的最晚开始时间。

最晚开始时间是指在不延误整个项目完成时间的情况下,从终点节点回到该节点所需的最短时间。

3.计算关键路径:根据每个节点的最早开始时间和最晚开始时间,找出那些最早开始时间和最晚开始时间相等的节点,这些节点就是关键路径上的节点。

关键路径的计算可以有效地帮助项目管理者确定项目的最短完成时间,并将各个活动按照优先级进行排序和调度,从而提高项目的管理效率。

二、最短路径最短路径是指在一个加权图中,从起点到终点所经过的边的权值之和最小的路径。

最短路径算法有很多种,下面介绍两种常用的最短路径算法:迪杰斯特拉算法和弗洛伊德算法。

1.迪杰斯特拉算法:迪杰斯特拉算法是一种贪心算法,用于解决单源最短路径问题。

具体步骤如下:-创建两个集合S和V-S,分别用于存放已确定最短路径的节点和待确定最短路径的节点。

最短路径问题课程设计

最短路径问题课程设计

最短路径问题 课程设计一、课程目标知识目标:1. 学生能理解最短路径问题的定义,掌握其在现实生活中的应用。

2. 学生掌握使用迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法求解最短路径问题的方法。

3. 学生能够分析并描述不同算法的时间复杂度及其适用场景。

技能目标:1. 学生能够运用所学算法,解决简单的最短路径问题。

2. 学生能够通过编程实践,加深对算法的理解,提高解决实际问题的能力。

3. 学生能够运用数学思维,对给定的问题进行分析,提出合理的解决方案。

情感态度价值观目标:1. 学生通过解决最短路径问题,培养对数学学科的兴趣和热情。

2. 学生在团队协作中,学会相互沟通、分享和借鉴,培养合作精神。

3. 学生在面对问题时,能够保持积极的态度,勇于挑战,不断探索和尝试。

课程性质:本课程为数学学科,结合计算机科学的知识,旨在提高学生的逻辑思维能力和解决实际问题的能力。

学生特点:学生处于高中阶段,具备一定的数学基础和编程能力,对新鲜事物充满好奇,喜欢挑战。

教学要求:注重理论与实践相结合,强调学生的主体地位,鼓励学生主动探究、积极思考,培养其创新意识和实践能力。

在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。

二、教学内容1. 最短路径问题的定义及其应用场景介绍- 网络图的基本概念- 最短路径问题的分类及其意义2. 迪杰斯特拉(Dijkstra)算法- 算法原理和步骤- 代码实现及案例分析- 算法时间复杂度分析3. 弗洛伊德(Floyd)算法- 算法原理和步骤- 代码实现及案例分析- 算法时间复杂度分析4. 最短路径算法的应用- 实际问题建模- 算法选择与应用- 解决方案评估5. 教学案例分析与实践- 结合实际案例,分析最短路径问题的解决方案- 学生编程实践,加深对算法的理解和应用- 针对不同场景,讨论算法的优缺点及适用性教学内容依据教材相关章节,结合课程目标进行安排。

在教学过程中,注意引导学生从理论到实践的过渡,通过案例分析和编程实践,使学生更好地掌握最短路径问题的求解方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、课程设计题目:校园最短路径问题二、课程设计目的:1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所具备的科学工作方法和作风。

三、课程设计要求:1.设计的题目要求达到一定的工作量(300行以上代码),并具有一定的深度和难度。

2.编写出课程设计报告书,内容不少于10页(代码不算)。

四、需求分析:1、问题描述图的最短路径问题是指从指定的某一点v开始,求得从该地点到图中其它各地点的最短路径,并且给出求得的最短路径的长度及途径的地点。

除了完成最短路径的求解外,还能对该图进行修改,如顶点以及边的增删、边上权值的修改等。

校园最短路径问题中的数据元素有:a) 顶点数b) 边数c) 边的长度2、功能需求要求完成以下功能:a)输出顶点信息:将校园内各位置输出。

b)输出边的信息:将校园内每两个位置(若两个位置之间有直接路径)的距离输出。

c)修改:修改两个位置(若两个位置之间有直接路径)的距离,并重新输出每两个位置(若两个位置之间有直接路径)的距离。

d)求最短路径:输出给定两点之间的最短路径的长度及途径的地点或输出任意一点与其它各点的最短路径。

e)删除:删除任意一条边。

f)插入:插入任意一条边。

3、实现要点a) 对图的创建采用邻接矩阵的存储结构,而且对图的操作设计成了模板类。

为了便于处理,对于图中的每一个顶点和每一条边都设置了初值。

b) 为了便于访问,用户可以先输出所有的地点和距离。

c) 用户可以随意修改两点之间好的距离。

d) 用户可以增加及删除边。

e) 当用户操作错误时,系统会出现出错提示。

五、概要设计:1.抽象数据类型图的定义如下:ADT Graph{数据对象V:V是具有相同特性数据元素的集合,称为顶点集。

数据关系R:R={VR}VR={(v,w)| v , w∈V, (v , w)表示v和w之间存在路径}基本操作P:CreatGraph(&G, V, VR)初始条件:V是图的顶点集,VR是图中边的集合。

操作结果:按定义(V, VR) 构造图G。

DestroyGraph(&G)初始条件:图G已存在。

操作结果:销毁图。

LocateVex(G, u)初始条件:图G存在,u和G中顶点具有相同特征。

操作结果:若G中存在顶点u,则返回该顶点在图中“位置”;否则返回其它信息。

GetVex(G, v)初始条件:图G存在,v是G中某个顶点。

操作结果:返回v的信息。

InsertVex(&G, v)初始条件:图G存在,v和G中顶点具有相同特征。

操作结果:在图G中增添新顶点v。

DeleteVex(&G, v)初始条件:图G存在,v和G中顶点具有相同特征。

操作结果:删除G中顶点v及其相关的边。

InsertArc(&G, v, w)初始条件:图G存在,v和w是G中两个顶点。

操作结果:在G中增添弧<v,w>,若G是无向的,则还增添对称弧<w,v>。

DeleteArc(&G, v, w)初始条件:图G存在,v和w是G中两个顶点。

操作结果:在G中删除弧<v,w>,若G是无向的,则还删除对称弧<w,v>。

} ADT Graph2.主程序void main(){初始化;while(“命令”!=“退出”){Switch语句接受命令(输入选择项序号);处理命令;}}3.本程序运用函数的调用,只有两个模块,它们的调用关系为:六、详细设计(详细见下面的源代码)typedef struct //图中顶点表示点,存放点名称void Menu() //输出菜单void PutOutVex(MGraph *G) //输出每个顶点的信息void PutOutArc(MGraph *G) //输出每条边的信息void Dijkstra(MGraph * G) //迪杰斯特拉算法求最短路径void DeleteVex(MGraph *G) //删除某个顶点void DeleteArc(MGraph *G) //删除某条边void InsertArc(MGraph *G) //插入某条边void main() //主函数七、源程序代码#include <stdio.h>#include <iostream.h>#include<stdlib.h>#include<conio.h>#include <malloc.h>#include<string.h>#define MAX 10000#define MAXLEN 8#define ADJTYPE inttypedef struct //图中顶点表示点,存放点名称{char name[30];int num;}VEXTYPE;typedef struct{VEXTYPE vexs[MAXLEN]; //顶点的信息ADJTYPE arcs[MAXLEN][MAXLEN]; //邻接矩阵int vexnum,arcnum ; //顶点数和边数}MGraph;MGraph b;MGraph InitGraph(){ /*建立无向网的邻接矩阵结构*/ int i, j;MGraph G;G.vexnum =8; //存放顶点数G.arcnum =13; //存放边点数for(i=0;i<G.vexnum;i++)G.vexs[i].num=i;strcpy(G.vexs[0].name,"第四教学楼");strcpy(G.vexs[1].name,"第三教学楼");strcpy(G.vexs[2].name,"图书馆");strcpy(G.vexs[3].name,"食堂");strcpy(G.vexs[4].name,"第一教学楼");strcpy(G.vexs[5].name,"第二教学楼");strcpy(G.vexs[6].name,"综合实验楼");strcpy(G.vexs[7].name,"校医院");for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[i][j]=MAX;G.arcs[0][1]=130;G.arcs[0][2]=80;G.arcs[0][3]=260;G.arcs[1][3]=75;G.arcs[2][4]=50;G.arcs[3][4]=120;G.arcs[1][5]=265;G.arcs[3][5]=85;G.arcs[3][6]=400;G.arcs[4][6]=350;G.arcs[5][6]=120;G.arcs[4][7]=200;G.arcs[6][7]=150;for(i=0;i<G.vexnum;i++)for(j=0;j<G.vexnum;j++)G.arcs[j][i]=G.arcs[i][j];return G;}void Menu() //输出菜单{ cout<<"需要输出顶点的信息请按0\n";cout<<"需要边的信息输出请按1\n";cout<<"需要修改请按2\n";cout<<"需要求出最短路径请按3\n";cout<<"需要删除某个顶点请按4\n";cout<<"需要删除某条边请按5\n";cout<<"需要插入某条边请按6\n";cout<<"需要退出请按7\n";}void PutOutVex(MGraph *G) //输出每个顶点的信息{int v;for(v=0;v<G->vexnum;v++)cout<<G->vexs[v].num<<G->vexs[v].name<<endl;}void PutOutArc(MGraph *G) //输出每条边的信息{for(int i=0;i<G->vexnum;i++)for(int j=0;j<G->vexnum;j++)if(G->arcs[i][j]<MAX){cout<<"从" <<G->vexs[i].name<<"到"<<G->vexs[j].name<<G->arcs[i][j]<<endl;}}void Change(MGraph *G) //修改{ int v0,v1,length;cout<<"change\n";cin>>v0;cin>>v1;cout<<"length:";cin>>length;G->arcs[v0][v1]=G->arcs[v1][v0]=length;}void Dijkstra(MGraph * G) //迪杰斯特拉算法求最短路径{int v,w,i,min,t=0,x,v0,v1;int final[20], D[20], p[20][20];cout<<"请输入源顶点:\n";cin>>v0;if(v0<0||v0>G->vexnum){cout<<"此点编号不存在!请重新输入顶点编号:";cin>>v0;}cout<<"请输入结束顶点:\n";cin>>v1;if(v1<0||v1>G->vexnum){cout<<"此点编号不存在!请重新输入顶点编号:";cin>>v1;}for(v=0;v<G->vexnum;v++){// 初始化final[20],p[20][20],final[v]=1即已经求得v0到v的最短路径,//p[v][w]=1则是w从v0到v当前求得最短路径上的顶点,D[v]带权长度final[v]=0;D[v]=G->arcs[v0][v];for(w=0;w<G->vexnum;w++)p[v][w]=0;if(D[v]<MAX){p[v][v0]=1;p[v][v]=1;}}D[v0]=0;final[v0]=1;for(i=1;i<G->vexnum;i++){min=MAX;for(w=0;w<G->vexnum;w++)if(!final[w])if(D[w]<min){v=w;min=D[w];}final[v]=1;for(w=0;w<G->vexnum;w++)if(!final[w]&&(min+G->arcs[v][w]<D[w])){D[w]=min+G->arcs[v][w];for(x=0;x<G->vexnum;x++)p[w][x]=p[v][x];p[w][w]=1;}}cout<<"从"<<G->vexs[v0].name<<"到"<<G->vexs[v1].name<<"的最短路径长度为:"<<D[v1]<<endl;cout<<"路径为:";for(int j=0;j<G->vexnum;j++){if(p[v1][j]==1)cout<<G->vexs[j].name<<endl;}}void DeleteVex(MGraph *G) //删除某个顶点{int row,col;int v0;cout<<"请输入要删除的顶点";cin>>v0;for(int i=v0;i<G->vexnum;i++)G->vexs[i]=G->vexs[i+1];G->vexnum--;for(row=0;row<G->vexnum;row++){for(col=v0;col<G->vexnum;col++)G->arcs[row][col]=G->arcs[row][col+1];}for(col=0;col<G->vexnum;col++){for(row=v0;row<G->vexnum;row++)G->arcs[col][row]=G->arcs[col][row+1];}}void DeleteArc(MGraph *G) //删除某条边{int v0,v1;cout<<"请输入两顶点:\n";cin>>v0>>v1;G->arcs[v0][v1]=MAX;G->arcs[v1][v0]=MAX;}void InsertArc(MGraph *G) //插入某条边{int v0,v1,l=0;cout<<"请输入两顶点:\n";cin>>v0>>v1;cout<<"请输入路径长度:\n";cin>>l;G->arcs[v0][v1]=l;G->arcs[v1][v0]=l;}void main() //主函数{ int a;b=InitGraph();Menu();cin>>a;while(a!=7){switch(a){case 0:PutOutVex(&b);Menu();break;case 1:PutOutArc(&b);Menu();break;case 2:Change(&b);Menu();break;case 3:Dijkstra(&b);Menu();break;case 4:DeleteVex(&b);Menu();break;case 5:DeleteArc(&b);Menu();break;case 6:InsertArc(&b);Menu();break;case 7:exit(1);break;default:break;}cin>>a;}}八、调试分析1) 本程序在求最短路径的问题上采用迪杰斯特拉算法解决,虽然该算法与弗洛伊德算法相比时间复杂度低,但每求一条最短路径都必须重新搜索一遍,在频繁查询时会导致查询效率低,而弗洛伊德算法只要计算一次,即可求得每一对顶点之间的最短路径,虽然时间复杂度为高,但以后每次查询只要查表即可,会极大地提高查询的效率,而且,弗洛伊德算法还支持带负权的图的最短路径的计算。

相关文档
最新文档