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

最短路径问题教案一、前置知识在学习最短路径问题之前,需要掌握以下基础知识: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. 教学案例分析与实践- 结合实际案例,分析最短路径问题的解决方案- 学生编程实践,加深对算法的理解和应用- 针对不同场景,讨论算法的优缺点及适用性教学内容依据教材相关章节,结合课程目标进行安排。
在教学过程中,注意引导学生从理论到实践的过渡,通过案例分析和编程实践,使学生更好地掌握最短路径问题的求解方法。
- 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) 本程序在求最短路径的问题上采用迪杰斯特拉算法解决,虽然该算法与弗洛伊德算法相比时间复杂度低,但每求一条最短路径都必须重新搜索一遍,在频繁查询时会导致查询效率低,而弗洛伊德算法只要计算一次,即可求得每一对顶点之间的最短路径,虽然时间复杂度为高,但以后每次查询只要查表即可,会极提高查询的效率,而且,弗洛伊德算法还支持带负权的图的最短路径的计算。