数据结构课程设计校园最短路径问题
最短路径问题教案
最短路径问题教案一、前置知识在学习最短路径问题之前,需要掌握以下基础知识:1.图的基本概念:顶点、边、度、路径、连通性等。
2.图的存储方式:邻接矩阵、邻接表等。
3.图的遍历算法:深度优先搜索(DFS)、广度优先搜索(BFS)等。
4.基本的算法思想:贪心、分治、动态规划等。
二、最短路径问题最短路径问题是指在一个加权图中,找到从一个顶点到另一个顶点的最短路径。
其中,加权图是指每条边都有一个权值,表示从一个顶点到另一个顶点的距离或代价。
最短路径问题是图论中的一个经典问题,也是许多实际问题的基础。
例如,在计算机网络中,路由器需要找到从源节点到目标节点的最短路径,以便将数据包传输到目标节点。
最短路径问题可以分为两类:单源最短路径和全源最短路径。
1. 单源最短路径单源最短路径是指从一个固定的源节点出发,到达图中其他所有节点的最短路径。
常见的算法有:•Dijkstra算法•Bellman-Ford算法•SPFA算法1.1 Dijkstra算法Dijkstra算法是一种贪心算法,用于解决单源最短路径问题。
它的基本思想是:从源节点开始,每次选择距离源节点最近的一个节点,然后以该节点为中心进行扩展,直到扩展到终点为止。
Dijkstra算法的具体步骤如下:1.初始化:将源节点到所有节点的距离初始化为无穷大,源节点到自身的距离为0。
2.选择:从未确定最短路径的节点中,选择距离源节点最近的节点。
3.更新:对于该节点的所有邻居节点,更新它们到源节点的距离。
4.标记:将该节点标记为已确定最短路径。
5.重复:重复步骤2~4,直到所有节点都被标记为已确定最短路径,或者无法到达终点。
Dijkstra算法的时间复杂度为O(n^2),其中n为节点数。
如果使用堆优化,可以将时间复杂度降为O(mlogn),其中m为边数。
1.2 Bellman-Ford算法Bellman-Ford算法是一种动态规划算法,用于解决单源最短路径问题。
它的基本思想是:从源节点开始,每次对所有边进行松弛操作,即尝试通过当前节点更新其他节点的距离,直到所有节点的距离都不再更新。
校园最短路径数据结构课程项目
校园最短路径数据结构课程项目一、概述在现代社会中,信息技术的发展已经渗透到了各行各业,成为了社会发展的推动力之一。
在这个信息时代中,交通信息的快速获取和准确传递已成为了各个城市及校园管理者面临的重要问题之一。
为了更好地解决城市和校园交通管理中的实际问题,数据结构课程的学生们在老师的指导下,进行了校园最短路径数据结构课程项目。
二、项目背景作为一所具有悠久历史和深厚文化底蕴的知名大学,我们校园占地面积广阔,各个教学楼、宿舍楼、图书馆和食堂等地点错综复杂,交通线路纵横交错。
传统的交通管理方式已经无法满足校园管理的需要,如何更好地设计一套校园最短路径系统成为了摆在我们面前的迫切问题。
三、技术原理在本次校园最短路径数据结构课程项目中,我们选择了图论中的Dijkstra算法作为基本技术原理。
Dijkstra算法采用贪心的策略,以节点为中心逐步逼近目标,具有较高的计算效率和准确性。
四、项目目标本次校园最短路径数据结构课程项目的主要目标是设计并实现一套高效的校园最短路径系统,使得师生、游客等使用者可以快速、准确地获取到校园内各个地点之间的最短路径信息,从而提高校园交通管理的效率和便利性。
五、项目实施1. 数据采集:我们需要对校园内各个地点的位置信息进行采集和整理,包括经纬度坐标、地点名称等信息。
2. 数据存储:采用合适的数据结构来存储和管理校园地点之间的交通信息,以便于后续路径查询的高效进行。
3. 算法实现:在以上基础上,我们需要实现Dijkstra算法,并对其进行优化,以适应大规模的校园最短路径查询。
4. 系统集成:将以上技术和功能进行集成,设计一套用户友好、界面美观的校园最短路径系统,并进行系统的测试和调试。
六、项目成果经过团队的不懈努力,我们最终成功地完成了校园最短路径数据结构课程项目,取得了一系列的成果:1. 实现了校园最短路径系统的基本功能,包括路径查询、地点显示等。
2. 对系统进行了大规模的测试,并优化了算法的性能和稳定性。
校园最短路径问题研究
2009年西北民族大学本科生数学建模竞赛承诺书我们仔细阅读了西北民族大学本科生数学建模竞赛的竞赛规则.我们完全明白,在竞赛开始后参赛队员不能以任何方式(包括电话、电子邮件、网上咨询等)与队外的任何人(包括指导教师)研究、讨论与赛题有关的问题。
我们知道,抄袭别人的成果是违反竞赛规则的, 如果引用别人的成果或其他公开的资料(包括网上查到的资料),必须按照规定的参考文献的表述方式在正文引用处和参考文献中明确列出。
我们郑重承诺,严格遵守竞赛规则,以保证竞赛的公正、公平性。
如有违反竞赛规则的行为,我们将受到严肃处理。
我们参赛选择的题号是(从A/B/C/D中选择一项填写): B我们的参赛的论文题目是:校园最短路径问题研究校园最短路径问题研究——以西北民族大学榆中校区为例摘要:本文以西北民族大学榆中校区为例,分析了其道路分布的特点,提出了如何选择最短路径的问题,并应用图与网络分析中的Dijskra算法和动态规划中的解决旅行售货员问题的方法,通过建立合适的数学模型,并适当的应用matlab软件,给出了实际问题中的最短路径和最佳路线,为大家提供参考。
建议在学习生活中选择合适的路线。
关键词:Dijskra算法最短路径旅行售货员AbstractIn this paper we use Northwest University for Nationalities YuZhong campus as an example, it analyzes the characteristics of the distribution of the road, and raise a question about how to choose the shortest path, and apply to Graph Theory and Network Analysis with Dijskra algorithm and Dynamic Programming in the Traveling Salesman Problem solving methods, through establish proper mathematical model, and appropriate application of matlab software, present a practical problem the shortest path and the best route, provide the reference for everyone. The suggestion is that we should choose the appropriate route in the study life .Key words: Dijskra algorithm the shortest path Traveling Salesman Problem1、问题的提出西北民族大学榆中校区是一个占地面积十分庞大的大学校园,由于其中仍有一些主体建筑正在建设过程中,导致校园内道路星罗棋布,错综复杂。
课程设计最短路径问题
课程设计最短路径问题一、课程目标知识目标:1. 让学生掌握最短路径问题的基本概念,理解其在现实生活中的应用。
2. 学会运用Dijkstra算法和Floyd算法解决最短路径问题。
3. 了解最短路径问题与其他优化问题的联系,拓展知识视野。
技能目标:1. 培养学生运用算法解决问题的能力,提高逻辑思维和计算思维能力。
2. 培养学生团队合作意识,学会在团队中分工合作,共同解决复杂问题。
3. 提高学生运用计算机软件(如Excel、编程语言等)处理数据的能力。
情感态度价值观目标:1. 培养学生面对问题的积极态度,勇于尝试和克服困难。
2. 增强学生对数学学科的兴趣和自信心,认识到数学在生活中的重要作用。
3. 培养学生具备良好的道德品质,遵循学术规范,尊重他人成果。
课程性质:本课程属于数学学科,以算法和实际应用为主线,结合计算机软件辅助教学。
学生特点:学生处于高年级阶段,具备一定的数学基础和逻辑思维能力,对算法和编程有一定了解。
教学要求:结合学生特点,课程要求注重理论与实践相结合,以学生为主体,引导他们主动探索和解决问题。
同时,关注学生的个性化差异,提供有针对性的指导和帮助。
通过本课程的学习,使学生能够达到上述课程目标,并在实际生活中运用所学知识解决问题。
二、教学内容1. 导入:通过实际生活中的最短路径问题(如导航系统、物流配送等)引出本节课的主题。
2. 基本概念:介绍最短路径问题的定义,包括加权图、路径长度等基本概念。
教材章节:第二章 图论基本概念3. 算法原理:a. Dijkstra算法:介绍单源最短路径算法原理,阐述其适用范围和限制。
b. Floyd算法:介绍多源最短路径算法原理,分析其时间复杂度。
教材章节:第三章 算法设计与分析4. 实践操作:a. 应用Dijkstra算法解决实际问题,如校园内两点间的最短路径。
b. 应用Floyd算法解决实际问题,如城市间最短路径规划。
教材章节:第四章 图论应用5. 计算机软件应用:运用Excel、编程语言(如Python、C++等)实现最短路径算法,分析实际数据。
数据结构课程设计最短路径问题实验报告
目录交通咨询系统设计(最短路径问题)一、概述在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。
在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。
这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城途中中转次数最少;如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低等等的一系列问题。
二、系统分析设计一个交通咨询系统,能咨询从任何一个城市顶点到另一城市顶点之间的最短路径(里程)、最低花费或是最少时间等问题。
对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。
针对最短路径问题,在本系统中采用图的相关知识,以解决在实际情况中的最短路径问题,本系统中包括了建立图的存储结构、单源最短问题、对任意一对顶点间最短路径问题三个问题,这对以上几个问题采用了迪杰斯特拉算法和弗洛伊德算法。
并未本系统设置一人性化的系统提示菜单,方便使用者的使用。
三、概要设计可以将该系统大致分为三个部分:① 建立交通网络图的存储结构;② 解决单源最短路径问题;③ 实现两个城市顶点之间的最短路径问题。
四、详细设计建立图的存储结构定义交通图的存储结构。
邻接矩阵是表示图形中顶点之间相邻关系的矩阵。
设G=(V,E)是具有n个顶点的图,则G的邻接矩阵是具有如下定义的n阶方阵。
注:一个图的邻接矩阵表示是唯一的!其表示需要用一个二维数组存储顶点之间相邻关系的邻接矩阵并且还需要用一个具有n个元素的一维数组来存储顶点信息(下标为i的元素存储顶点V的信息)。
i邻接矩阵的存储结构:附录#include<>#include<>#defineMVNum100#defineMaxint32767enumboolean{FALSE,TRUE}; typedefcharVertexType;typedefintAdjmatrix;typedefstruct{VertexTypevexs[MVNum];Adjmatrixarcs[MVNum][MVNum];}MGraph;intD1[MVNum],p1[MVNum];intD[MVNum][MVNum],p[MVNum][MVNum]; voidCreateMGraph(MGraph*G,intn,inte){inti,j,k,w;for(i=1;i<=n;i++)G->vexs[i]=(char)i;for(i=1;i<=n;i++)for(j=1;j<=n;j++)G->arcs[i][j]=Maxint;printf("输入%d条边的及w:\n",e);for(k=1;k<=e;k++){scanf("%d,%d,%d",&i,&j,&w);G->arcs[i][j]=w;}printf("有向图的存储结构建立完毕!\n"); }voidDijkstra(MGraph*G,intv1,intn){intD2[MVNum],p2[MVNum];intv,i,w,min;enumbooleanS[MVNum];for(v=1;v<=n;v++){S[v]=FALSE;D2[v]=G->arcs[v1][v];if(D2[v]<Maxint)p2[v]=v1;elsep2[v]=0;}D2[v1]=0;S[v1]=TRUE;for(i=2;i<n;i++){min=Maxint;for(w=1;w<=n;w++)if(!S[w]&&D2[w]<min){v=w;min=D2[w];}S[v]=TRUE;for(w=1;w<=n;w++)if(!S[w]&&(D2[v]+G->arcs[v][w]<D2[w])){D2[w]=D2[v]+G->arcs[v][w];p2[w]=v;}}printf("路径长度路径\n");for(i=1;i<=n;i++){printf("%5d",D2[i]);printf("%5d",i);v=p2[i];while(v!=0){printf("<-%d",v);v=p2[v];}printf("\n");}}voidFloyd(MGraph*G,intn){inti,j,k,v,w;for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(G->arcs[i][j]!=Maxint)p[i][j]=j;elsep[i][j]=0;D[i][j]=G->arcs[i][j];}for(k=1;k<=n;k++){for(i=1;i<=n;i++)for(j=1;j<=n;j++){if(D[i][k]+D[k][j]<D[i][j]){D[i][j]=D[i][k]+D[k][j];p[i][j]=p[i][k];}}}}voidmain(){MGraph*G;intm,n,e,v,w,k;intxz=1;G=(MGraph*)malloc(sizeof(MGraph));printf("输入图中顶点个数和边数n,e:");scanf("%d,%d",&n,&e);CreateMGraph(G,n,e);while(xz!=0){printf("************求城市之间最短路径************\n");printf("=========================================\n");printf("1.求一个城市到所有城市的最短路径\n");printf("2.求任意的两个城市之间的最短路径\n");printf("=========================================\n");printf("请选择:1或2,选择0退出:\n");scanf("%d",&xz);if(xz==2){Floyd(G,n);printf("输入源点(或起点)和终点:v,w:");scanf("%d,%d",&v,&w);k=p[v][w];if(k==0)printf("顶点%d到%d无路径!\n",v,w);else{printf("从顶点%d到%d最短路径路径是:%d",v,w,v);while(k!=w){printf("--%d",k);k=p[k][w];}printf("--%d",w);printf("径路长度:%d\n",D[v][w]);}}elseif(xz==1)printf("求单源路径,输入源点v:");scanf("%d",&v);Dijkstra(G,v,n);}printf("结束求最短路径,再见!\n"); }。
大数据结构,课程设计,校园最短路径问题
一、课程设计题目:校园最短路径问题二、课程设计目的: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是具有相同特性数据元素的集合,称为顶点集。
数据结构最短路径课程设计
数据结构最短路径课程设计一、课程目标知识目标:1. 理解图的基本概念,掌握图的表示方法及其特性;2. 掌握最短路径的两种经典算法:Dijkstra算法和Floyd算法;3. 能够运用所学算法解决实际生活中的最短路径问题。
技能目标:1. 能够运用数据结构中的图,进行实际问题的建模;2. 能够编写并实现Dijkstra算法和Floyd算法,解决最短路径问题;3. 能够通过分析、比较两种算法,选择合适的算法解决特定问题。
情感态度价值观目标:1. 培养学生面对复杂数据结构问题时,保持积极探究、解决问题的态度;2. 培养学生的团队协作能力,学会在团队中分享、交流、互助;3. 通过解决实际生活中的问题,培养学生将所学知识应用于实践的意识。
课程性质分析:本课程为数据结构中的图部分,以最短路径为具体实例,帮助学生理解图的概念及其在实际中的应用。
学生特点分析:学生已具备一定的编程能力和数据结构基础知识,但对图的相关概念和算法掌握不足,需要通过具体案例和实际操作,提高理解和应用能力。
教学要求:1. 以实际问题引入,激发学生的学习兴趣;2. 采用任务驱动法,引导学生自主探究、实践;3. 结合课堂讲解和实际操作,使学生在实践中掌握知识;4. 注重团队合作,培养学生的沟通与协作能力。
二、教学内容1. 图的基本概念:图的定义、图的表示方法(邻接矩阵、邻接表)、图的遍历(深度优先搜索、广度优先搜索)。
2. 最短路径问题:最短路径的定义、最短路径算法的应用场景。
3. Dijkstra算法:算法原理、算法步骤、实例分析、编程实现。
4. Floyd算法:算法原理、算法步骤、实例分析、编程实现。
5. 算法比较与分析:Dijkstra算法与Floyd算法的优缺点比较、适用场景分析。
6. 实践项目:设计一个实际场景的最短路径问题,要求学生运用所学算法进行解决。
教学内容安排与进度:第一课时:图的基本概念、图的表示方法、图的遍历。
第二课时:最短路径问题、Dijkstra算法原理与实例分析。
最短路径问题课程设计
最短路径问题 课程设计一、课程目标知识目标:1. 学生能理解最短路径问题的定义,掌握其在现实生活中的应用。
2. 学生掌握使用迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法求解最短路径问题的方法。
3. 学生能够分析并描述不同算法的时间复杂度及其适用场景。
技能目标:1. 学生能够运用所学算法,解决简单的最短路径问题。
2. 学生能够通过编程实践,加深对算法的理解,提高解决实际问题的能力。
3. 学生能够运用数学思维,对给定的问题进行分析,提出合理的解决方案。
情感态度价值观目标:1. 学生通过解决最短路径问题,培养对数学学科的兴趣和热情。
2. 学生在团队协作中,学会相互沟通、分享和借鉴,培养合作精神。
3. 学生在面对问题时,能够保持积极的态度,勇于挑战,不断探索和尝试。
课程性质:本课程为数学学科,结合计算机科学的知识,旨在提高学生的逻辑思维能力和解决实际问题的能力。
学生特点:学生处于高中阶段,具备一定的数学基础和编程能力,对新鲜事物充满好奇,喜欢挑战。
教学要求:注重理论与实践相结合,强调学生的主体地位,鼓励学生主动探究、积极思考,培养其创新意识和实践能力。
在教学过程中,将课程目标分解为具体的学习成果,便于教学设计和评估。
二、教学内容1. 最短路径问题的定义及其应用场景介绍- 网络图的基本概念- 最短路径问题的分类及其意义2. 迪杰斯特拉(Dijkstra)算法- 算法原理和步骤- 代码实现及案例分析- 算法时间复杂度分析3. 弗洛伊德(Floyd)算法- 算法原理和步骤- 代码实现及案例分析- 算法时间复杂度分析4. 最短路径算法的应用- 实际问题建模- 算法选择与应用- 解决方案评估5. 教学案例分析与实践- 结合实际案例,分析最短路径问题的解决方案- 学生编程实践,加深对算法的理解和应用- 针对不同场景,讨论算法的优缺点及适用性教学内容依据教材相关章节,结合课程目标进行安排。
在教学过程中,注意引导学生从理论到实践的过渡,通过案例分析和编程实践,使学生更好地掌握最短路径问题的求解方法。
数据结构课程设计报告-最短路径算法-二叉树的三种遍历
数据结构课程设计报告班级:计算机科学与技术132班姓名:赖恒财指导教师:董跃华成绩:32信息工程学院2015 年7月8日目录图的最短路径算法实现1. 需求分析 (1)1.1 程序设计内容 (1)1.2 设计要求 (1)2.概要设计 (2)3.详细设计 (2)3.1 数据类型的定义 (2)3.2 功能模块的设计 (2)3.3 主程序流程 (9)4.调试分析 (10)4.1 问题回顾和分析 (10)4.2.经验和体会 (11)5.测试结果 (12)二叉树的遍历1.设计目的 (13)2.需求分析 (14)2.1课程设计的内容和要求 (14)2.2选题的意义及背景 (14)3.概要设计 (14)3.1设计思想 (14)3.2程序数据类型 (16)3.3程序模块分析 (16)3.3.1置空栈 (16)3.3.2入栈 (17)3.3.3出栈 (17)3.3.4取栈顶操作 (17)3.3.5判空栈 (17)3.4函数关系: (18)4.详细设计 (18)4.1二叉树算法程序截图和结果 (18)5.程序测试结果及问题分析 (19)6.总结 (20)参考文献 (21)附录1 (22)附录2 (26)图的最短路径算法实现----基于floyd最短路径算法1.需求分析设计校园平面图,所含景点不少于8个。
以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。
要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。
1.1程序设计内容1.从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图;2.景点信息查询:为来访客人提供校园任意景点相关信息的介绍;3.问路查询:为来访客人提供校园任意两个景点之间的一条最短路径。
1.2 设计要求(1) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。
(2) 程序要添加适当的注释,程序的书写要采用缩进格式。
数据结构实验报告 最短路径
实验报告实验名称最短路径课程名称数据结构与算法实验||专业班级:信息安全学号:姓名:实验六最短路径一、实验目的1.学习掌握图的存储结构2.学会编写求最短路径的算法二、实验内容1、实验题目编写代码实现Dijkstra生成最短路径的算法,其中要有完整的图的输入输出2、简单介绍图的存储:用邻接矩阵,这样会方便不少。
邻接矩阵是一个二维数组,数组中的元素是边的权(一些数值),数组下标号为结点的标号。
(1)例如二维数组中的一个元素M[5][6]的值为39,则表示结点5、6连接,且其上的权值为39。
(2)用邻接矩阵存储图,对图的读写就简单了。
因为邻接矩阵就是一个二维数组,因此对图的读写就是对二维数组的操作。
只要能弄清楚边的编号,就能把图读入了。
用一对结点表示边(也就是输入的时候输入一对结点的编号)求最短路径的算法:求最短路径就是求图中的每一个点到图中某一个给定点(这里认为是编号为0的点)的最短距离。
具体算法就是初始有一个旧图,一个新图。
开始的时候旧图中有所有的结点,新图中初始为只有一个结点(源点,路径的源头)。
整个算法就是不停的从旧图中往新图中添加点,直到所有的点都添加到新图中为止。
要实现这个算法,除了用二维数组保存图,还需要使用到两个辅助的数组数组find[N]:此数组是用来表示标号对应的结点是否已经被添加到新图中(因为只有旧图中的点我们才需要添加到新图中,并且只有旧图中点到源点的距离,我们才需要进行更新)其中N为图中结点的个数。
数组distance[N]:此数组记录图中的点到源点的距离。
这个数组里面存放的值是不断进行更新的。
其中N为图中结点的个数。
3、程序简单模板只是参考,不需要照着这个来写//最短路径#ifndef MYGRAPH_H_#define MYGRAPH_H_class MyGraph{public:void readDirectedGraph();MyGraph(int size);//构造函数中设置图的大小,分配空间void writeGraph();void shortPath(int source);//求最短路径protected:private:int **m_graph;//用二维数组保存图int m_size;//图的大小};#endif///////////////////////////////////////////// //////////////////////////构造函数中设置图的大小,分配空间MyGraph::MyGraph(int size){int i,j;m_size=size;//给图分配空间m_graph=new int* [m_size];for (i=0;i<m_size;i++){m_graph[i]=new int[m_size];}for (i=0;i<m_size;i++){for(j=0;j<m_size;j++){m_graph[i][j]=INT_MAX;}}}三、实验代码#include<iostream>#include <iomanip>#include <stack>#include <deque>#include <fstream>using namespace std;struct primnode{public:char begvex;char endvex;int lowcost;};struct adknode{int dist;//最近距离char way[50];//顶点数组int nodenum;//经过的顶点数};class Mgraph//邻接矩阵储存结构{public:Mgraph(){}~Mgraph(){}void CreatMGraph();void DFS (int );//用递归实现void DFS1(int );//非递归void BFS(int );void print();void prim();int mini();int low();//最短距离函数的辅助函数int LocateVex(char);void kruskal();void Dijkstra();void Floyd();private:int number;//顶点数目int arcnum;//边的数目char vexs[50];int arcs[50][50];int visited[50];//便利时的辅助工具primnode closeedge[50];//primadknode dist[50];//最短路径int D[20][20];//floyd算法距离int P[20][20][20];//floyd算法路径};int Mgraph::LocateVex(char s){for(int i=0;i<number;i++)if (vexs[i]==s)return i;return -1;}void Mgraph::print(){cout<<"顶点为:";for(int k=0;k<number;k++)cout<<vexs[k];cout<<endl;for(int i=0;i<number;i++){for(int j=0;j<number;j++)cout<<setw(6)<<left<<arcs[i][j]<<" ";cout<<endl;}for(int m=0;m<number;m++)cout<<visited[m];cout<<endl;}void Mgraph::CreatMGraph()//图的邻接矩阵储存结构{char vex1,vex2;int i,j,k,m;cout<<"请输入定点数,边数:"<<endl;cin>>number>>arcnum;cout<<"请输入顶点(字符串类型):"<<endl;for(i=0;i<number;i++)cin>>vexs[i];for(i=0;i<number;i++)for(j=0;j<number;j++)arcs[i][j]=1000;for(k=0;k<arcnum;k++){cout<<"请输入边的两个顶点及边的权值:"<<endl; cin>>vex1>>vex2>>m;i=LocateVex(vex1);j=LocateVex(vex2);arcs[i][j]=m;arcs[j][i]=m;}}void Mgraph::DFS(int i=0)//用递归实现{int j;cout<<vexs[i]<<"------>";visited[i]=1;for (j=0;j<number;j++){if(!(arcs[i][j]==1000)&&!visited[j])DFS(j);}}void Mgraph::DFS1(int i=0)//非递归{stack<int> st;st.push(i);while(!st.empty()){int j=st.top();st.pop();cout<<vexs[j]<<"---->";visited[j]=1;for(int k=0;k<number;k++){if((!(arcs[j][k]==1000))&&!visited[k])st.push(k);}}}void Mgraph::BFS(int i=0)//广度优先遍历{deque<int> de;de.push_back(i);cout<<vexs[i]<<"------>";visited[i]=1;while(!de.empty()){int k=de.front();for(int j=0;j<number;j++){if(arcs[k][j]!=1000&&!visited[j]){cout<<vexs[j]<<"------>";visited[j]=1;de.push_back(j);}}de.pop_front();}}int Mgraph::mini(){static int i;int min=0;for (int j=0;j<number;j++){if(!visited[j]){if (closeedge[min].lowcost>closeedge[j].lowcost){min=j;}}}i=min;cout<<"包括边("<<closeedge[i].begvex<<","<<closeedge[i].endvex<<")"; return i;}void Mgraph::prim(){char u;cout<<"请输入起始顶点:"<<endl;cin>>u;int i=LocateVex(u);visited[i]=1;for(int j=0;j<number;j++){closeedge[j].begvex=u;closeedge[j].endvex=vexs[j]; closeedge[j].lowcost=arcs[i][j];}for (int m=1;m<number;m++){int n=mini();visited[n]=1;closeedge[n].lowcost=1000;for (int p=0;p<number;p++){if(!visited[p]){if(arcs[p][n]<closeedge[p].lowcost){closeedge[p].lowcost=arcs[p][n];closeedge[p].begvex=vexs[n];}}}}}void Mgraph::kruskal(){int a,b,k=0;int min=1000;int arcs1[20][20];for (int m=0;m<number;m++)visited[m]=m;//每一个顶点属于一颗树for (int i=0;i<number;i++)for(int j=0;j<number;j++)arcs1[i][j]=arcs[i][j];while (k<number-1){min=1000;for (int i=0;i<number;i++){for (int j=0;j<number;j++){if (arcs1[i][j]<min){a=i;b=j;min=arcs1[i][j];}}}if (visited[a]!=visited[b]){cout<<"包括边("<<vexs[a]<<","<<vexs[b]<<")";k++;for (int n=0;n<number;n++){if (visited[n]==visited[b])visited[n]=visited[a];}}elsearcs1[a][b]=arcs[b][a]=1000;}}void Mgraph::Dijkstra(){cout<<"请输入起始点"<<endl;char u;cin>>u;int i=LocateVex(u);visited[i]=1;for (int j=0;j<number;j++){dist[j].dist=arcs[i][j];dist[j].nodenum=0;}for (j=1;j<number;j++){int distance=1000;int min=0;for (int n=0;n<number;n++){if(!visited[n]){if (distance>dist[n].dist){distance=dist[n].dist;min=n;}}}int m=min;visited[m]=1;for (n=0;n<number;n++){if(!visited[n]){if((dist[m].dist+arcs[m][n])<dist[n].dist){dist[n].dist=dist[m].dist+arcs[m][n];dist[n].nodenum=0;for (int x=0;x<dist[m].nodenum;x++){dist[n].way[x]=dist[m].way[x];dist[n].nodenum++;}dist[n].way[dist[n].nodenum++]=vexs[m];} } } }//输出功能for (int n=0;n<number;n++){if (n!=i){ if(dist[n].dist<1000){cout<<vexs[i]<<"到"<<vexs[n]<<"的最近距离为:"<<dist[n].dist<<endl;cout<<"经过的顶点为:"<<vexs[i]<<"---->";for (int p=0;p<dist[n].nodenum;p++){ cout<<dist[n].way[p]<<"----->";}cout<<vexs[n]<<endl;}elsecout<<vexs[i]<<"到"<<vexs[n]<<"没有通路"<<endl;} } }void Mgraph::Floyd(){int i,j,m,n;for ( i=0;i<number;i++)for ( j=0;j<number;j++)for (m=0;m<number;m++)P[i][j][m]=0;for ( i=0;i<number;i++)for ( j=0;j<number;j++){D[i][j]=arcs[i][j];if(D[i][j]<1000){P[i][j][i]=1;P[i][j][j]=1;} }for ( i=0;i<number;i++)for ( j=0;j<number;j++)for (m=0;m<number;m++){if (i==j||j==m||i==m)continue;if (D[i][m]+D[m][j]<D[i][j]){D[i][j]=D[i][m]+D[m][j];for (n=0;n<number;n++){P[i][j][n]=P[i][m][n]||P[m][j][n];} } }for ( i=0;i<number;i++)for ( j=0;j<number;j++){if (D[i][j]<1000){cout<<vexs[i]<<"到"<<vexs[j]<<"的最近距离为:"<<D[i][j]<<endl;cout<<"经过的顶点为:";for (m=0;m<number;m++){if (P[i][j][m]){cout<<vexs[m]<<"------>";} }cout<<endl;}elseif (i!=j)cout<<vexs[i]<<"到"<<vexs[j]<<"没有通路"<<endl;}}int main(){Mgraph g;g.CreatMGraph();g.Floyd();return 0;}四、实验结果五、实验总结本次实验主要是学习掌握图的存储结构,学会编写求最短路径的算法。
数据结构课程设计报告Dijkstra算法求最短路径
3.5递归函数的应用---------------------------------------------------------------------------10
}MGrph;//邻接矩阵表示的图
3.1.1顶点的定义typedef char VertexType;//定义图的顶点为字符型 顶点的最大个数25
3.1.2ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];二维数组用于存放邻接矩阵,每个位置代表的值为图中的权值,其余用无穷大3000表示。
}ArcCell;
typedef struct{
VertexType vexs[MAX_VERTEX_NUM];//一维数组,存储顶点
ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];//邻接矩阵 :二维数组,存储边和弧
int vexnum,arcnum;//图的当前顶点数和弧数
2.原始数据的输入格式
2.1建图:2.1.1数字
2.2显示:2.2.1数字+逗号+数字+回车
2.2.2字母+回车
3.实现功能
3.1建立有向图
3.2显示存储的有向图
3.3显示从顶点到其他各个顶点的最短路径和是否存在路径
4.测试用例
4.1正确数据:输入顶点;边值信息
输出结果:最短路径是否存在,存在的情况最短路径是多少,其次是不存在。
第1章问题分析与任务定义
1、课程设计题目:
数据结构课程设计最短路径
数据结构课程设计题目名称:最短路径计算机科学与技术学院一、需求分析(1)题目:最短路径实现图的输入,选择合适的结构表示图,在此基础上实现求解最短路径的算法,可以从任意一点求最短路径,学生必须准备多组测试数据,并设计清晰易懂的输入输出界面,要求:如何用多种数据结构来求解问题。
同时要求实现对应数据结构的所有基本操作。
(2)程序的输入与输出:要求用多种数据结构求解问题,也就是要用邻接表与邻接矩阵实现最短路径的算法,需要有多组输入输出,(a)输入的形式和输入值的范围:输入的形式为整型1.先输入共需要创建几次图2.再分别输入边数和顶点数(范围:1~100)3.输入1和2选择是否为有向图图(1为有向,2为无向)4.对应每条边输入起点和终点下标,以及对这条边的权值(最大的权值为100)。
5.输入在邻接表的基础上输入深度与广度优先搜索的起点6.我们输入求各种最短路径起点和终点(b)输出的形式;1.输出所建立的邻接表(表结点后面的括号是头结点与表结点的权值)2.输出DFS和BFS的结果3.输出该图不带权值的最短路径与路径4.接下来输入起点和终点,求带权值的最短路径也就是Dijstra算法,输出长度并给出路径5.前面都是用邻接表实现的各种算法,接下来的Floyd算法就用矩阵实现,于是直接邻接表转矩阵输出6.用Floyd算法求出图的多源最短路径,给出起点终点输出最短路径长度,接着便到了第二次创建图,直至循环结束。
(3)程序的功能:求给出带权图的任意两点,输出最短路径长度并给出其最短路径所经过的顶点。
在实际应用中可以将交通网络化成带权的图,图中顶点表示城市,边代表城市之间的公路,边上的权值表示公路的长度。
这样可以发现两个地方之间有无公路可连,在几条公路可通的情况下,可以找到那条路径最短。
也就是现在地图app中的功能。
(4)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。
在有向图中输入错误的数据(顶点与顶点方向相反),会输出逆向信息。
数据结构课程设计最短路径
数据结构课程设计最短路径一、课程目标知识目标:1. 理解图的基本概念,掌握图的表示方法,如图的邻接矩阵和邻接表;2. 掌握最短路径问题的定义,了解其应用场景;3. 学会运用Dijkstra算法和Floyd算法解决最短路径问题;4. 了解最短路径算法的时间复杂度,并能够分析其优缺点。
技能目标:1. 能够运用所学知识,编写程序实现最短路径算法;2. 能够分析实际问题,选择合适的数据结构和算法解决最短路径问题;3. 学会使用调试工具,调试并优化最短路径算法程序。
情感态度价值观目标:1. 培养学生对数据结构课程的兴趣,激发学习热情;2. 培养学生的团队合作精神,学会在团队中分工合作,共同解决问题;3. 培养学生面对问题时的耐心和毅力,勇于克服困难,寻求解决方案;4. 通过解决实际问题,增强学生的应用意识和创新意识。
课程性质:本课程为计算机科学专业选修课程,旨在帮助学生掌握图论中的最短路径问题及其算法实现。
学生特点:学生已经具备一定的编程基础,熟悉C/C++等编程语言,了解基本的数据结构,如数组、链表、栈和队列等。
教学要求:结合学生特点和课程性质,注重理论与实践相结合,通过实例分析、算法实现和调试优化,使学生掌握最短路径问题的解决方法,并培养其分析问题和解决问题的能力。
在教学过程中,关注学生的情感态度价值观的培养,提高学生的综合素质。
二、教学内容1. 图的基本概念:图的定义、图的分类、图的表示方法(邻接矩阵、邻接表)。
2. 最短路径问题:最短路径的定义、应用场景、最短路径算法的分类。
3. Dijkstra算法:算法原理、算法步骤、实例分析、编程实现。
4. Floyd算法:算法原理、算法步骤、实例分析、编程实现。
5. 最短路径算法时间复杂度分析:比较Dijkstra算法和Floyd算法的时间复杂度,分析其适用场景。
6. 实践环节:设计实际案例,让学生动手编写程序实现最短路径算法,并进行调试优化。
7. 算法优化:探讨最短路径算法的优化方法,如优先队列、动态规划等。
高中信息竞赛数据结构—最短路径
}
} ④ 输出;
典型例题—最短路径问题1249
Description: 平面上有n个点(n<=100),每个点的坐标均在-10000到10000之
间.其中的一些点之间有连线.若有连线,则表示可从一个点到达另一 个点,即两点间有通路,通路的距离为两点间的直线距离.现在的任务 是找出从一点到另一点之间的最短路径. Input:
我们按最短路径长度递增的顺序把第二组的结点加到第一组中去,直至 v0可达的所有结点都包含于第一组。在这个过程中,总保持从v0到第一组各 结点的最短路径长度都不大于从v0至第二组任何结点的路径长度。
disti
w0i
(v0, vi ) E (v0, vi ) E
初始时v0进入第一组,v0的距离值为0;第二组包含其它所有结 点,这些结点对应的距离值为v0到它的值即map[v0][vi]
{ w=maxint;
for(j=1;j<=n;j++) if(!vs[j]&&dist[j]<w)//找到最小点,注意判断条件
{k=j;w=dist[j];}//保存当前最短点 vs[k]=true;//将最短点做标记 for(j=1;j<=n;j++)//利用找到的点优化还没有访问的点
if(!vs[j]&&(map[k][j]!=maxint)&&dist[k]+map[k][j]<dist[j]) {dist[j]:=dist[k]+map[k,j];//修正最短路径 path[j]:=k; //保存路径
典型例题—最短路径问题1249
Sample Input 5 00 20 22 02 31 5 12 13 14 25 35 15 Sample Output:3.41
校园最短路径问题研究报告与实现
校园最短路径问题的研究与实现学生姓名:指导老师:摘要本课程设计主要解决求的校园任意地点间最短路径的问题。
在本程序中,对于任意一个起点,如果不确定具体的终点,则以表格形式输出从起点到其他各地点的最短路径长度以及途经哪些地点;如果用户确定终点,则只输出从起点到具体地点的最短路径长度以及途经哪些地点。
同时还能实现对校园路径图的修改功能,如顶点以及边的增删、边上权值的修改等。
在程序设计中,采用Visual C++程序设计语言,以及Microsoft Visual C++ 6.0开发平台进行开发实现。
关键词校园最短路径;起点;终点;路径图修改;C++目录1.引言 (3)1.1课程设计目的 (3)1.2概要设计 (3)2.详细设计 (5)2.1功能流程图 (5)2.2类的定义 (5)2.3功能函数实现 (7)2.4算法分析 (14)2.5程序调试 (14)3.测试运行 (16)3.1开始界面测试 (16)3.2输出顶点信息功能测试 (16)3.3输出边信息功能测试 (16)3.4修改功能测试 (17)3.5求最短路径功能测试 (17)3.6删除顶点功能测试 (18)3.7插入顶点功能测试 (19)3.8删除边功能测试 (19)3.9插入边功能测试 (20)3.10退出程序测试 (21)4.结束语 (23)参考文献 (24)附录:程序清单 (25)1 引言本课程设计主要解决校园最短路径的求取,校园中的各具体地点作为顶点,各顶点间的路径作为边,可实现对顶点及边的信息进行添加、删除及修改等功能,可显示各顶点及边的信息,可求出每一对顶点间的最短路径和单源点最短路径[1]。
1.1 课程设计目的1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学工作方法和作风[2]。
《数据结构》最短路径关键路径及其应用解析
a3
a8
a1
a7
a4
a9
a2
a5
a6
施工从活动 a1、 a2开始,到达活动 a8和 a9时,整个 施工结束。这类有向图中,顶点表示活动,弧< ai, aj >表示活动 ai优先于活动 aj ,称这类有向图为顶点 表示活动的网(AOV网)。
AOV网可解决如下两个问题: (1)判定工程的可行性。显然,有回路,整个工 程就无法结束
D(-1)
D(0)
D(1)
D(2)
D
0
1
2
0
1
2
0
1
2
0
1
2
0
0
4 11 0
4 11 0
4
6
0
4
6
1
6
0
2
6
0
2
6
0
2
5
0
2
2
3
0
3
7
0
3
7
0
3
7
0
P(-1)
P(0)
P(1)
P(2)
P
0
1
2
0
1
2
0
1
2
0
1
2
0
AB AC
AB AC
AB ABC
AB ABC
1 BA
BC BA
BC BA
BC BCA
BC
2 CA
则图G的邻接矩阵为:
+
甲 乙 丙 丁 戊己
+
甲∞ ∞ 7 4 ∞ ∞
+
+
乙2 ∞ ∞ ∞ ∞ 8
+
课程设计_最短路径算法
沈阳大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:最短路径算法院(系):信息工程学院专业:通信工程专业班级:12级通信2班学号:F1258212姓名:刘维成指导教师:目录1 课程设计介绍 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2 课程设计原理 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (3)2.2.1 功能模块图 (3)2.2.2 流程图分析 (3)3 数据结构分析 (8)3.1存储结构 (8)3.2算法描述 (8)4 调试与分析 (9)4.1调试过程 (9)4.2程序执行过程 (9)参考文献 (11)附录(关键部分程序清单) (12)1 课程设计介绍1.1 课程设计内容设计程序,实现最短路径的求法,系统主要功能如下:1.编写算法能够建立带权图,并能够用Dijkstra算法求该图的最短路径。
2.能够选择图上的任意一顶点做为开始节点。
最短路径输出不必采用图形方式,可顶点序列方式输出。
1.2 课程设计要求1.带权图的顶点信息用字符串,数据可自定。
2.参考相应的资料,独立完成课程设计任务。
3.较规范课程设计报告和软件代码。
2 课程设计原理2.1 课设题目粗略分析根据课设题目要求,拟将整体程序分为三大模块。
两个子模块相互独立,没有嵌套调用的情况,在主模块中调用上面两个子模块以下是三个模块的大体分析:1.建立有向图的存储结构.2.应用Dijkstra算法求出该有向图的最短路径。
3.在主函数中调用上面两个子函数,完成求最短路径的程序设计。
4.2.2 原理图介绍2.2.1 功能模块图图2.1 功能模块图 2.2.2 流程图分析1. 主函数2.2主函数流程图2. Create 函数2.3Create函数流程图3.Dijkstra函数2.4Dijkstra函数流程图3 数据结构分析3.1 存储结构一个图的邻接矩阵表示是唯一的。
图的邻接矩阵表示,除了需要用一个二维数组存储顶点之间相邻关系的邻接矩阵外,通常还需要使用一个具有n个元素的一维数组存储顶点信息,其中下标为i的元素存储顶点vi的信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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) 本程序在求最短路径的问题上采用迪杰斯特拉算法解决,虽然该算法与弗洛伊德算法相比时间复杂度低,但每求一条最短路径都必须重新搜索一遍,在频繁查询时会导致查询效率低,而弗洛伊德算法只要计算一次,即可求得每一对顶点之间的最短路径,虽然时间复杂度为高,但以后每次查询只要查表即可,会极提高查询的效率,而且,弗洛伊德算法还支持带负权的图的最短路径的计算。