数据结构与算法课程设计 城市公共交通最短线路
公交路线查询课程设计

《算法与数据结构》课程设计报告题目:公交线路专业:软件工程班级: 1003学号: 41姓名:简指导教师:魏完成日期:2012 年 06月 17 日一、课程设计目的本课程设计的目标就是要达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,并培养基本的、良好的程序设计技能以及合作能力。
设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。
通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、课程设计内容建立某城市(如福州)主要公交线路图查询站点路线三、课程设计过程[基本要求]输入任意两站点,给出最佳的乘车线路和转车地点。
如:该城市共有n条公交线路,m个公交站点。
其中,公交线路1经过编号为1,2,4,7的站点,公交线路2经过编号为3,5,7,8,的站点,则从站点2到站点8的最佳乘车线路是:乘坐公交线路1从站点2到站点7再乘坐公交线路2到站点8。
[测试数据]该城市共有3条公交线路,6个公交站点,其中:第1条公交线路经过站点:1,2第2条公交线路经过站点:2,3,4第3条公交线路经过站点:4,5用图的最短路径算法实现(转乘次数最少)2.概要设计1)为了实现上述程序功能,需要定义图数据类型:typedef struct // 图的定义{ char name[MAX_VERTEX_NUM];int vexs[MAX_VERTEX_NUM];int vexnum,arcnum; // 顶点信息弧的信息int ln,l,n; //ln是路线数,l是路线,n是站点数,d是站点,nu路径数int vexno[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //顶点: 路线,路线中的站点数int arclin[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 弧: 站点-站点,,存的是权值} mgraph;基本操作:void create(mgraph &g)输入路线,站点信息,站点间关系操作结果:创建公交线路图,void floyd (mgraph g,int v,int w)计算最少换乘路径。
数据结构课程设计—城市道路交通咨询系统【范本模板】

(2)用户根据自己设置的城市个数和路径数,具体输入每个路径的起始点以及每条路径的长度。
(3)进入菜单选择界面
(4)选择2,系统为用户进行提供任意城市的交通查询,即查询任意两个城市之间的一条最短路径。
基本思想:设G(V,E)是一个带权有向图,把图中的顶点集合V分成两组,第一组为已经求出的最短路径的顶点集合(用S表示,初始时S中只有一个原点,以后每求得一条最短路径就加入的集合S中,知道全部顶点都加入到集合中),第二组,为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点就如S中。如果两个顶点之间有权值,并且各个路径的权值不同,就把最小的作为顶点与顶点的最短距离.
3.定义一个Floyd函数
void Floyd(MGraph*G,int n);
2
图2—2
邻接矩阵构造图结构函数
数据类型定义:
typedef struct
{
VertexTypevexs[MAX];
Adjmatrix arcs[MAX][MAX];
}MGraph;
void CreateMGraph(MGraph *G,int n,int e)//邻接矩阵构成有向图
这次在应用中,我发现了自己的很多不足,在编写城市交通咨询系统的过程中,自己C语言方面的只是掌握太少,很多功能需求只能退而求其次,一次又一次的更改,一次又一次的失败,也终于是在最后也完成了自己的要求,同时我也知道了平时用功学习的重要性。尤其是在日常学习之中,对于单一的只是点也许掌握的还不错,但是自己动手太少,实践经验严重不足,且面临课程设计之时,要求多方面的只是结和编码,对于我而言还是有很大的难度的。如此次对于邻接矩阵的存储于读取,以及最短路径算法的实现,两个及其重要的算法,狄克斯特拉算法和佛洛依德算法,在具体的应用上还是有很多不足。
数据结构课程设计---交通旅游图的最短路径问题

数据结构课程设计报告题目交通旅游图的最短路径问题学生姓名*****指导教师*****学院******专业班级******完成时间********摘要数据结构主要是一门研究非数值计算的程序设计问题中的计算机操作对象以及它们之间的关系和操作等的学科。
数据结构在计算机科学与技术中是一门综合性的专业基础课,其研究不仅涉及到计算机硬件的研究范围,而且和计算机软件的研究有着更密切的关系。
不论是编译程序过程还是操作系统都涉及到数据元素在存储器中的分配问题。
在计算机科学与技术中,数据结构不仅是一般程序性的基础,而且也是其他系统程序和大型程序的重要基础。
在交通网络非常发达,交通工具和交通方式不断更新的今天,人们在出差、旅游或做其它出行时,不仅关心节省费用,而且对里程和所需时间等问题也感兴趣。
对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。
图中顶点表示站点之间的交通关系。
这个交通系统可以回答旅客提出的各种问题。
比如任意一个站点到其他站点的最短路径,任意两个站点之间的最短路径问题。
本次设计的交通咨询系统主要是运用C语言来完成交通图的存储、图中顶点的最短路径和任意一对顶点间的最短路径问题。
关键字:数据结构课程设计交通咨询系统目录前言 (1)第一章设计要求 (2)1.1设计内容 (2)1.2设计目的 (3)1.3设计分析 (4)第二章系统功能模块的设计 (5)2.1 系统功能分析与设计 (5)2.1.1系统简介 (5)2.1.2 系统流程图 (5)2.2 各功能模块简介 (6)2.2.1结构体的建立 (6)2.2.2 图的建立与初始化 (6)2.2.3 邻接矩阵的输出 (8)2.2.4 显示函数 (8)2.2.5 最短路径算法 (9)2.2.6主函数 (10)第三章实践结果与调试 (12)3.1运行结果 (12)3.1.1主界面 (12)3.1.2查询站点编号模块 (12)3.1.3邻接矩阵查询模块 (12)3.1.4最短路径查询模块 (13)3.2运行调试及发现问题 (15)3.2.1调试过程 (15)3.2.2发现问题 (15)第四章设计总结与心得 (16)附录:程序源代码 (18)前言乘汽车旅行的人总希望找出到目的地的尽可能短的行程。
数据结构课程设计最短路径问题实验报告

目录交通咨询系统设计(最短路径问题)一、概述在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。
在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。
这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从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"); }。
算法与数据结构课件——最短路径

50 10 60 edgeTo[3] = 0,反过来排列,
2 20 3
得到路径 0, 3, 2, 4,这就是源 点0到终点4的最短路径。
Dijkstra示例
顶点0 0 0
顶点1 -
顶点2 -
顶点3 -
顶点4 -
索引堆:
0
10 0 100
1 30 4
50 10
60
2 20 3
0
1
2
3
4
0
-
-
-
-
Dijkstra示例
短路径长度; ➢ ...... ➢ dist n-1 [u]为从源点s出发最多经过不构成负权值回路的n-1次relax到达终点u的
最短路径长度;
• 算法的最终目的是计算出dist n-1 [u],为源点v到顶点u的最短 路径长度。
dist k [u]的计算
• 设已经求出 dist k-1 [u] , u = 0, 1, …, n-1,即从源点s经过最多 不构成负权值回路的k-1次relax到达终点u的最短路径的长度
点,该值为无穷大) ➢ distTo[v]是最短路径,当且仅当:对于任意一条v到w的边e,都满足:
distTo[w] ≤ distTo[v] + e.weight()
最短路径通用算法
• 算法SP(G, s):
➢ distTo[s] 初始化为 0 ➢ 对于其他各个节点, distTo[v]初始化为无穷大 ➢ 重复如下操作:松驰G中的任意边,直到不存在有效边为止
➢ dist 1 [u]为从源点s到终点u的最多经过1次relax的最短路径长度,并有dist 1 [u] =adj[s][u];
➢ dist 2 [u]为从源点s最多经过两次relax到达终点u的最短路径长度; ➢ dist 3 [u]为从源点s出发最多经过不构成负权值回路的三次relax到达终点u的最
数据结构最短路径课程设计

数据结构最短路径课程设计一、课程目标知识目标: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)以用户指定的起点和终点,输出从起点到终点的花费。
一、需求分析:1、本程序需要用矩阵来存储图的各种信息。
2、测试数据输入(文件)5-1 10 3 20 -1-1 -1 -1 5 -1-1 2 -1 -1 15-1 -1 -1 -1 11-1 -1 -1 -1 -1(用户)起点 0终点 4输出18实现提示:(1)设图的顶点大于1个,不超过30个,每个顶点用一个编号表示(如果一个图有n个顶点,则它们的编号分别为0, 1, 2, 3, …, n-1)。
(2)此题为求有向网中顶点间最短路径问题,可建立以票价为权的邻接矩阵,用Dijkstra算法求最短路径长度。
(3) Dijkstra算法中有一个辅助向量D,表示当前所找到的从源点到其它点的最短路径长度。
因为每次都要在D中找最小值,为提高性能,用最小值堆的优先队列存储D值。
(4)考虑没有路径时的输出。
二、概要设计:抽象数据类型:为实现上述功能需建立一个二维数组和图类。
算法的基本思想:1、图的信息的读取:定义一个二维数组,将图的信息读入,并将两边距离为-1的边转换为一个较大的数(>>途中各点之间的距离)。
2、Dijkstra算法:根据输入的第一个结点首先找到(直接距离)该点最近的A,则这两点之间的边是必须的,然后比较通过A到其他点的距离l1和直接到其他点的距离l2。
如果l1<l2,则用l1的距离替换l2。
重复上述操作n-1(n为结点数)次。
得到的即为第一个结点到其他结点的最短距离。
程序的流程程序由三个模块组成:输入模块:读入图的信息(用矩阵进行存储)。
处理模块:Dijkstra算法。
数据结构课程设计报告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、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构与算法课程设计一、问题描述及设计目的城市公共交通最短线路,利用邻接矩阵来构建交通节点,邻接矩阵的行列编号即为交通中的节点,有行列决定的数据即为权值基本的输入信息和条件:1. 输入总的节点个数,即为交通中的站点数目本程序中,站点的数目最大值为100。
2. 输入存在的通路,即为弧两个站点之间是联通的弧的数目是有限制的,数目小于站点数目[n*(n-1)]/23. 输入存在通路的两点,即为两站点站点编号要小于站点总数目二、应具备的功能1. 确定起点的最短路径问题,即已知起始结点,求最短路径的问题。
2. 确定终点的最短路径问题,与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。
在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
3. 确定起点终点的最短路径问题,即已知起点和终点,求两结点之间的最短路径。
三、设计思想、主要算法的实现、基本操作、子程序调用关系1.Dijkstra算法的基本思想按路径长度递增顺序求最短路径算法。
2.Dijkstra 算法的基本步骤设V0是起始源点,S是已求得最短路径的终点集合。
V-S = 未确定最短路径的顶点的集合,初始时S={V0},长度最短的路径是边数为1且权值最小的路径。
下一条长度最短的路径:①V i V - S ,先求出V0到V i中间只经S 中顶点的最短路径;②上述路径中长度最小者即为下一条长度最短的路径;②将所求最短路径的终点加入S 中;重复直到求出所有终点的最短路径。
3.存储结构设计本系统采用图结构类型(mgraph)存储抽象交通图的信息。
其中:各站点间的邻接关系用图的邻接矩阵类型存储;图的顶点个数及边的个数由分量n、e表示,它们是整型数据。
数据结构如下:typedef struct{ int no; //顶点编号InfoType info; //顶点其他信息,这里用于存放边的权值} VertexType; //顶点类型typedef struct //图的定义{ int edges[MAXV][MAXV]; //邻接矩阵int n,e; //顶点数,弧数VertexType vexs[MAXV]; //存放顶点信息} MGraph; //图的邻接矩阵类型查询站点间的最短路程距离和路径该功能是查询站点的最短路径,包括距离和线路,有Floyd( )函数实现。
输出邻接矩阵该功能即输出图的邻接矩阵的值,由函数DispMat(g)实现4.算法设计分析实现功能的几个主要函数的代码构成和实现方式(1).输出邻接矩阵通过循环嵌套,即双重循环,打印矩阵数据时间复杂度由站点数n确定T=O(n^2)void DispMat(MGraph g) //输出邻接矩阵g{int i,j;for (i=0;i<g.n;i++){for (j=0;j<g.n;j++)if (g.edges[i][j]==INF)printf("%3s","∞"); //表示两站点间不可达elseprintf("%3d",g.edges[i][j]);printf("\n");}}(2).求最短路线通过自递归,逐个输出最短路径所经过的站点编号Ppath( )函数在path中递归输出从站点i到站点j的最短路径void ppath(int path[][MAXV],int i,int j) //输入各条最短路经{int k;k=path[i][j];if (k==-1) return;ppath(path,i,k); //递归printf("%3d,",k); //输出站点编号ppath(path,k,j);}(3).求最短路线的距离Path二维数组保存最短路径,它与当前的迭代的次数有关。
求A[i][j]时,path[i][j]存放从顶点i到j的中间编号大于k的最短路径上前一个结点的编号。
在算法结束时,有二维数组path的值追溯,可以得到从i到j的最短路径,若path[i][j]=-1.则没有中间站点。
void Floyd(MGraph g) //弗洛伊德算法从每对顶点之间的最短路径{int A[MAXV][MAXV],path[MAXV][MAXV];int i,j,k,f,r,n=g.n;for (i=0;i<n;i++) //给A数组置初值for (j=0;j<n;j++){A[i][j]=g.edges[i][j];path[i][j]=-1;}for (k=0;k<n;k++) //计算Ak{for (i=0;i<n;i++)for (j=0;j<n;j++)if (A[i][j]>(A[i][k]+A[k][j])){A[i][j]=A[i][k]+A[k][j];path[i][j]=k;}}printf("\n输出需要查找的两个站点:\n");printf("起点:");scanf("%3d",&f);while(f>=n){printf("该点不存在,请重新输入!\n");printf("起点:");scanf("%3d",&f);};printf("终点:");scanf("%3d",&r);while(r>=n){printf("该点不存在,请重新输入!\n");printf("终点:");scanf("%3d",&r);};while(r==f){printf("不能等于起点,请重新输入!\n");printf("终点:");scanf("%3d",&r);};printf("\n输出最短路径:\n");if (A[f][r]==INF){ if(f!=r)printf("从%3d到%3d没有路径\n",f,r);}else{printf("从%3d到%3d路径为:",f,r);printf("%3d,",f);ppath(path,f,r);printf("%3d",r);printf("\t路径长度为:%3d\n",A[f][r]);}}四、环境和工具、用户手册1.环境与工具vc++6.02.用户手册本程序只能对程序原有的结点进行输入查找最短距离等基础功能,不能用于对其它的邻接矩阵的查找操作。
五、详细设计(源程序清单)#include <stdio.h>#defineMAXV 100 //最大顶点个数#define INF 32767 //用32767表示∞typedef int InfoType; //假设InfoType为int类型//以下定义邻接矩阵类型typedef struct{ i nt no; //顶点编号InfoType info; //顶点其他信息,这里用于存放边的权值} VertexType; //顶点类型typedef struct //图的定义{ i nt edges[MAXV][MAXV]; //邻接矩阵int n,e; //顶点数,弧数VertexType vexs[MAXV]; //存放顶点信息} MGraph; //图的邻接矩阵类型void DispMat(MGraph g) //输出邻接矩阵g{int i,j;for (i=0;i<14;i++){for (j=0;j<14;j++)if (g.edges[i][j]==INF)printf("%3s","∞");elseprintf("%3d",g.edges[i][j]);printf("\n"); }}void ppath(int path[][MAXV],int i,int j) //输入各条最短路经{ int k;k=path[i][j];if (k==-1) return;ppath(path,i,k);printf("%3d,",k);ppath(path,k,j);}void Floyd(MGraph g) //弗洛伊德算法从每对顶点之间的最短路径{int A[MAXV][MAXV],path[MAXV][MAXV];int i,j,k,f,r,n=14;for (i=0;i<n;i++) //给A数组置初值for (j=0;j<n;j++){ A[i][j]=g.edges[i][j];path[i][j]=-1;}for (k=0;k<n;k++) //计算Ak{for (i=0;i<n;i++)for (j=0;j<n;j++)if (A[i][j]>(A[i][k]+A[k][j])){ A[i][j]=A[i][k]+A[k][j];path[i][j]=k; } }printf("\n输出需要查找的两个站点(站点编号为0-13):\n");printf("起点:");scanf("%3d",&f);while(f>=n){ printf("该点不存在,请重新输入!\n");printf("起点:");scanf("%3d",&f); };printf("终点:");scanf("%3d",&r);while(r>=n){printf("该点不存在,请重新输入!\n");printf("终点:");scanf("%3d",&r); };while(r==f){printf("不能等于起点,请重新输入!\n");printf("终点:");scanf("%3d",&r);};printf("\n输出最短路径:\n");if (A[f][r]==INF){ if(f!=r)printf("从%3d到%3d没有路径\n",f,r);}else{ printf("从%3d到%3d路径为:",f,r);printf("%3d,",f);ppath(path,f,r);printf("%3d",r);printf("\t路径长度为:%3d\n",A[f][r]);}}void main(){ printf("交通网路的邻接矩阵为\n");int i,j;MGraph g;intA[14][14]={{32767,32767,32767,32767,32767,32767,32767,8,32767,32767, 32767,32767,32767,32767},{32767,32767,32767,32767,32767,32767,32767 ,6,32767,8,32767,32767,32767,32767},{32767,32767,32767,32767,32767,3 2767,32767,32767,32767,7,32767,32767,32767,32767},{32767,32767,3276 7,32767,32767,32767,32767,32767,5,32767,7,32767,32767,32767},{32767, 32767,32767,32767,32767,32767,32767,32767,32767,32767,6,32767,32767,9},{32767,32767,32767,32767,32767,32767,32767,32767,32767,32767,327 67,6,32767,8},{32767,32767,32767,32767,32767,32767,32767,32767,32767 ,32767,32767,32767,6,32767},{32767,6,32767,32767,32767,32767,32767,3 2767,32767,32767,32767,32767,32767,32767},{8,32767,32767,5,32767,327 67,32767,32767,32767,32767,32767,32767,32767,32767},{32767,8,7,32767 ,32767,32767,32767,32767,32767,32767,32767,32767,32767,32767},{3276 7,32767,32767,7,6,32767,32767,32767,32767,32767,32767,32767,32767,32 767},{32767,32767,32767,32767,32767,6,32767,32767,32767,32767,32767, 32767,1,32767},{32767,32767,32767,32767,32767,32767,6,32767,32767,32 767,32767,1,32767,32767},{32767,32767,32767,32767,9,8,32767,32767,32 767,32767,32767,32767,32767,32767}};for (i=0;i<14;i++)for (j=0;j<14;j++)g.edges[i][j]=A[i][j];DispMat(g);Floyd(g);}六、结果分析及算法评价程序主界面及输入起点:输入起点终点输出最短路径:总结分析此次算法的编辑过程,使我熟练的掌握了邻接矩阵存储结构的使用,从另一面了解到迪克斯拉算法,更深刻的意识到清晰的思路能够使程序简单明了。