数据结构与算法课程设计 城市公共交通最短线路
公交路线查询课程设计
![公交路线查询课程设计](https://img.taocdn.com/s3/m/9570dc1552d380eb62946d24.png)
《算法与数据结构》课程设计报告题目:公交线路专业:软件工程班级: 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)计算最少换乘路径。
数据结构课程设计—城市道路交通咨询系统【范本模板】
![数据结构课程设计—城市道路交通咨询系统【范本模板】](https://img.taocdn.com/s3/m/8b7aa6e0f78a6529657d5368.png)
(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语言方面的只是掌握太少,很多功能需求只能退而求其次,一次又一次的更改,一次又一次的失败,也终于是在最后也完成了自己的要求,同时我也知道了平时用功学习的重要性。尤其是在日常学习之中,对于单一的只是点也许掌握的还不错,但是自己动手太少,实践经验严重不足,且面临课程设计之时,要求多方面的只是结和编码,对于我而言还是有很大的难度的。如此次对于邻接矩阵的存储于读取,以及最短路径算法的实现,两个及其重要的算法,狄克斯特拉算法和佛洛依德算法,在具体的应用上还是有很多不足。
数据结构课程设计---交通旅游图的最短路径问题
![数据结构课程设计---交通旅游图的最短路径问题](https://img.taocdn.com/s3/m/43a5da78caaedd3383c4d33b.png)
数据结构课程设计报告题目交通旅游图的最短路径问题学生姓名*****指导教师*****学院******专业班级******完成时间********摘要数据结构主要是一门研究非数值计算的程序设计问题中的计算机操作对象以及它们之间的关系和操作等的学科。
数据结构在计算机科学与技术中是一门综合性的专业基础课,其研究不仅涉及到计算机硬件的研究范围,而且和计算机软件的研究有着更密切的关系。
不论是编译程序过程还是操作系统都涉及到数据元素在存储器中的分配问题。
在计算机科学与技术中,数据结构不仅是一般程序性的基础,而且也是其他系统程序和大型程序的重要基础。
在交通网络非常发达,交通工具和交通方式不断更新的今天,人们在出差、旅游或做其它出行时,不仅关心节省费用,而且对里程和所需时间等问题也感兴趣。
对于这样一个人们关心的问题,可用一个图结构来表示交通网络系统,利用计算机建立一个交通咨询系统。
图中顶点表示站点之间的交通关系。
这个交通系统可以回答旅客提出的各种问题。
比如任意一个站点到其他站点的最短路径,任意两个站点之间的最短路径问题。
本次设计的交通咨询系统主要是运用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)前言乘汽车旅行的人总希望找出到目的地的尽可能短的行程。
数据结构课程设计最短路径问题实验报告
![数据结构课程设计最短路径问题实验报告](https://img.taocdn.com/s3/m/bd4ae8664b73f242336c5f83.png)
目录交通咨询系统设计(最短路径问题)一、概述在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。
在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。
这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从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"); }。
算法与数据结构课件——最短路径
![算法与数据结构课件——最短路径](https://img.taocdn.com/s3/m/4a812ce1ec3a87c24028c4f4.png)
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的最
数据结构最短路径课程设计
![数据结构最短路径课程设计](https://img.taocdn.com/s3/m/7062b31aa9956bec0975f46527d3240c8447a1a5.png)
数据结构最短路径课程设计一、课程目标知识目标: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算法原理与实例分析。
数据结构实验报告十一—最短路径问题
![数据结构实验报告十一—最短路径问题](https://img.taocdn.com/s3/m/db7c2c06a6c30c2259019e62.png)
问题描述:若用有向网表示某地区的公路交通网,其中顶点表示该地区的一些主要场所,弧表示已有的公交线路,弧上的权表示票价。
试设计一个交通咨询系统,指导乘客以最少花费从该地区中的某一场所到达另一场所。
基本要求:(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算法求最短路径
![数据结构课程设计报告Dijkstra算法求最短路径](https://img.taocdn.com/s3/m/f18bcc9f6c175f0e7cd13791.png)
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、课程设计题目:
数据结构课程设计最短路径
![数据结构课程设计最短路径](https://img.taocdn.com/s3/m/b0c4a88b77eeaeaad1f34693daef5ef7ba0d12c0.png)
数据结构课程设计最短路径一、课程目标知识目标: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. 算法优化:探讨最短路径算法的优化方法,如优先队列、动态规划等。
图的最短路径实现(数据结构课程设计)
![图的最短路径实现(数据结构课程设计)](https://img.taocdn.com/s3/m/1b5fc6fd81c758f5f61f67a7.png)
内容和要求广东省主要大城市之间的交通图如下所示,每条边上的权值代表从城市A到城市B的路途长度,使用数据结构图的相关理论编程给出广州到各个城市的最短路径,并且输出经过的路径。
进一步了解数据结构中对图的各种操作,以及求最短路径的算法。
解决方案和关键代码解决方案:思路:首先把图用带权邻接矩阵g表示出来(每个城市看做一个顶点,广州是v0),然后用c语言实现书上的迪杰斯特拉算法,求有向网g的v0顶点到其余顶点v 的最短路径保存到D[v],以及途经的一个最近新的路径保存Path[v]。
最后输出D[v]以及Path[v]。
其中:(v0是广州;v1是佛山;v2是肇庆;v3是珠海;v4是深圳;v5是南宁;v6是香港)关键代码#include <iostream>#pragma warning (disable:4996)using namespace std;//定义我们需要的变量char cityName[7][256];//用于表示城市之间的关系,依次是广州,佛山,肇庆,珠海,深圳,南宁,香港int dis[7][7] = {{ -1, 100, 200, 200, -1, -1, -1 },{ -1, -1, -1, 50, 150, -1, -1 },{ -1, -1, -1, 100, -1, 150, -1 },{ -1, -1, -1, -1, 80, 350, -1 },{ -1, -1, -1, -1, -1, -1, 150 },{ -1, -1, -1, -1, 360, -1, 450 },{ -1, -1, -1, -1, -1, -1, -1 } };int from[7];int disSum[7];int current, current1;int nextNoList[7];int nextNoList1[7];char path[7][256];char temp[256];int main(){//将广州等字符串复制给cityName数组中strcpy(cityName[0], "广州");strcpy(cityName[1], "佛山");strcpy(cityName[2], "肇庆");strcpy(cityName[3], "珠海");strcpy(cityName[4], "深圳");strcpy(cityName[5], "南宁");strcpy(cityName[6], "香港");int i, j;for (i = 0; i < 7; i++){disSum[i] = -1;from[i] = -1;}current = 1;nextNoList[0] = 0;disSum[0] = 0;strcpy(path[0], cityName[0]);//用Dijkstra算法计算图的最短路径while (current){current1 = 0;for (j = 0; j < current; j++){for (i = 1; i < 7; i++){if (dis[nextNoList[j]][i] != -1){if (disSum[i] == -1 || disSum[i] > disSum[nextNoList[j]] +dis[nextNoList[j]][i]){disSum[i] = disSum[nextNoList[j]] +dis[nextNoList[j]][i];nextNoList1[current1++] = i;from[i] = nextNoList[j];strcpy(temp, path[nextNoList[j]]);strcat(temp, " -> ");strcat(temp, cityName[i]);strcpy(path[i], temp);}}}}current = current1;for (j = 0; j < current1; j++){nextNoList[j] = nextNoList1[j];}}//显示各个效果for (i = 1; i < 7; i++){printf("从%s到%s : %d : %s\n", cityName[0], cityName[i], disSum[i], path[i]);}return 0;}数据测试与结果总结:本次主要运用了Dijkstra算法(迪杰斯特拉算法)来求得两个点之间的最短路径,理论是还是很好明白的,但在本次的实验中,最难的就是上机实现这个算法问题。
数据结构课程设计任务书-4
![数据结构课程设计任务书-4](https://img.taocdn.com/s3/m/4f29517a7fd5360cba1adb91.png)
课程设计任务书
课程名称:数据结构与算法课程设计
设计题目:交通咨询系统
问题描述:
设计一个交通咨询系统,为自驾游旅行者客咨询从任一个城市到另一个城市之间的最短路径问题。
设计分三个部分,一是建立交通网络图的存储结构;二是解决单源最短路径问题;最后再实现两个城市顶点之间的最短路径问题。
基本要求:
1 对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能;
2 咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。
由用户选择输入起点、终点,输出信息:旅行者从起点、终点经过的每一座城市。
3.主程序可以有系统界面、菜单;也可用命令提示方式;选择功能模块执行,要求在程序运行过程中可以反复操作。
测试数据:
参考《数据结构(C语言版)》(严蔚敏吴伟民编著)7.6节图7.33的交通图。
答辩测试数据:北京到乌鲁木齐;北京到昆明;广州到哈尔滨;乌鲁木齐到南昌;沈阳到昆明。
选作内容:
考虑由于路况不同,不同城市间自驾旅行每百公里油耗不同,为旅行选择最经济路线。
设计工作量:
40课时
工作计划:
见课表
指导教师签名:日期:2013.12.1
教研室主任签名:日期:
系主任签名:日期:。
数据结构课程设计报告-Floyd算法求解最短路径
![数据结构课程设计报告-Floyd算法求解最短路径](https://img.taocdn.com/s3/m/92a1dca3fe4733687f21aaaf.png)
数据构造课程设计报告撰写要求〔一〕纸与页面要求1.采用国际标准A4型打印纸或复印纸,纵向打印。
2.封页和页面按照下面模板书写〔正文为:小四宋体1.5倍行距〕。
3.图表及图表标题按照模板中的表示书写。
〔二〕课设报告书的容应包括以下各个局部:〔按照以下顺序装订〕1.封页(见课设模版)2、学术诚信声明,所有学生必须本人签字,否那么教师拒绝给予成绩。
2.任务书(学生教师均要签字,信息填写完整)3.目录4.正文一般应包括以下容:〔1)题目介绍和功能要求〔或描述〕课程设计任务的详细描述(注意不能直接抄任务书),将容做更详细的具体的分析与描述;〔2) 系统功能模块构造图绘制系统功能构造框图及主要模块的功能说明;〔3)使用的数据构造的描述:数据构造设计及用法说明;〔4) 涉及到的函数的描述;〔5) 主要算法描述( 程序流程图)〔6) 给出程序测试/运行的结果设计多组数据加以描述〔包括输入数据和输出结果〕〔7) 课程设计的总结及体会〔8) 参考文献格式要求:[1]作者,等. 书名.出版地:,出版年5.附录:程序清单(应带有必要的注释)航空航天大学课程设计报告课程设计名称:数据构造课程设计课程设计题目:利用弗洛伊德〔Floyd)算法求解最短路径院〔系〕:计算机学院专业:计算机科学与技术(物联网方向)班级:34010105学号:姓名:指导教师:说明:结论〔优秀、良好、中等、及格、不及格〕作为相关教环节考核必要依据;格式不符合要求;数据不实,不予通过。
报告和电子数据必须作为实验现象重复的关键依据。
学术诚信声明本人声明:所呈交的报告〔含电子版及数据文件〕是我个人在导师指导下独立进展设计工作及取得的研究结果。
尽我所知,除了文中特别加以标注或致中所罗列的容以外,报告中不包含其他人己经发表或撰写过的研究结果,也不包含其它教育机构使用过的材料。
与我一同工作的同学对本研究所做的任何奉献均己在报告中做了明确的说明并表示了意。
报告资料及实验数据假设有不实之处,本人愿意承受本教学环节“不及格〞和“重修或重做〞的评分结论并承当相关一切后果。
《数据结构课程设计》最短路径问题实验报告
![《数据结构课程设计》最短路径问题实验报告](https://img.taocdn.com/s3/m/7caacb9352ea551811a68757.png)
《数据结构课程设计》最短路径问题实验报告目录一、概述 0二、系统分析 0三、概要设计 (1)四、详细设计 (5)4.1建立图的存储结构 (5)4.2单源最短路径 (6)4.3任意一对顶点之间的最短路径 (7)五、运行与测试 (8)参考文献 (11)附录 (12)交通咨询系统设计(最短路径问题)一、概述在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。
在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。
这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城途中中转次数最少;如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低等等的一系列问题。
二、系统分析设计一个交通咨询系统,能咨询从任何一个城市顶点到另一城市顶点之间的最短路径(里程)、最低花费或是最少时间等问题。
对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。
针对最短路径问题,在本系统中采用图的相关知识,以解决在实际情况中的最短路径问题,本系统中包括了建立图的存储结构、单源最短问题、对任意一对顶点间最短路径问题三个问题,这对以上几个问题采用了迪杰斯特拉算法和弗洛伊德算法。
并未本系统设置一人性化的系统提示菜单,方便使用者的使用。
三、概要设计可以将该系统大致分为三个部分:①建立交通网络图的存储结构;②解决单源最短路径问题;③实现两个城市顶点之间的最短路径问题。
迪杰斯特拉算法流图:弗洛伊德算法流图:四、详细设计4.1建立图的存储结构定义交通图的存储结构。
邻接矩阵是表示图形中顶点之间相邻关系的矩阵。
设G=(V,E)是具有n 个顶点的图,则G 的邻接矩阵是具有如下定义的n 阶方阵。
⎪⎩⎪⎨⎧∞>∈<=,其他情况或或,若0E(G)V ,V )V ,(V ],[j i j i ij W j i A 注:一个图的邻接矩阵表示是唯一的!其表示需要用一个二维数组存储顶点之间相邻关系的邻接矩阵并且还需要用一个具有n 个元素的一维数组来存储顶点信息(下标为i 的元素存储顶点i V 的信息)。
《数据结构》最短路径关键路径及其应用解析
![《数据结构》最短路径关键路径及其应用解析](https://img.taocdn.com/s3/m/9bd0f3096d85ec3a87c24028915f804d2b1687b7.png)
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
+
数据结构与算法课程设计城市公共交通最短线路
![数据结构与算法课程设计城市公共交通最短线路](https://img.taocdn.com/s3/m/03b70931d15abe23492f4d24.png)
数据结构与算法课程设计一、问题描述及设计目的城市公共交通最短线路,利用邻接矩阵来构建交通节点,邻接矩阵的行列编号即为交通中的节点,有行列决定的数据即为权值基本的输入信息和条件:1. 输入总的节点个数,即为交通中的站点数目本程序中,站点的数目最大值为100。
2. 输入存在的通路,即为弧两个站点之间是联通的弧的数目是有限制的,数目小于站点数目[n *( n-1)]/23. 输入存在通路的两点,即为两站点站点编号要小于站点总数目二、应具备的功能1. 确定起点的最短路径问题,即已知起始结点,求最短路径的问题。
2. 确定终点的最短路径问题,与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。
在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
3. 确定起点终点的最短路径问题,即已知起点和终点,求两结点之间的最短路径。
三、设计思想、主要算法的实现、基本操作、子程序调用关系1. Dijkstra算法的基本思想按路径长度递增顺序求最短路径算法。
2. Dijkstra算法的基本步骤设V。
是起始源点,S是已求得最短路径的终点集合。
V-S =未确定最短路径的顶点的集合,初始时S={V 0},长度最短的路径是边数为1且权值最小的路径。
下一条长度最短的路径:①V i • V - S,先求出V o到V i中间只经S中顶点的最短路径;② 上述路径中长度最小者即为下一条长度最短的路径; ② 将所求最短路径的终点加入 S 中; 重复直到求出所有终点的最短路径。
3. 存储结构设计本系统采用图结构类型(mgraph )存储抽象交通图的信息。
其中: 各站点间的邻接关系用图的邻接矩阵类型存储;图的顶点个数及边的 个数由分量n 、e 表示,它们是整型数据。
数据结构如下:typedef struct//顶点编号查询站点间的最短路程距离和路径int no;In foType info;//顶点其他信息,这里用于存放边的权值} VertexType; //顶点类型 typedef struct// 图的定义int edges[MAXV][MAXV]; //邻接矩阵int n,e;//顶点数,弧数VertexType vexs[MAXV]; //存放顶点信息 } MGraph;// 图的邻接矩阵类型该功能是查询站点的最短路径,包括距离和线路,有Floyd()函数实现。
最短地铁乘坐线路小软件的数据结构课程设计的需求
![最短地铁乘坐线路小软件的数据结构课程设计的需求](https://img.taocdn.com/s3/m/ed081062814d2b160b4e767f5acfa1c7aa00820f.png)
最短地铁乘坐线路小软件的数据结构课程设计介绍在现代城市中,地铁已经成为人们最常用的交通工具之一。
然而,由于地铁线路的复杂性和不同线路之间的转换,人们在选择最短地铁乘坐线路时常常感到困惑。
为了解决这一问题,开发一款最短地铁乘坐线路小软件非常有必要。
本文将详细探讨该小软件的需求以及使用的数据结构设计。
小软件需求最短地铁乘坐线路小软件的主要功能是根据用户输入的起始站和目的站,计算出最短的地铁乘坐线路,并提供相关的信息。
具体需求如下:1.用户可以输入起始站和目的站。
2.程序将根据输入的起始站和目的站计算出最短的地铁乘坐线路。
3.程序应该提供该线路的详细信息,包括经过的站点、换乘次数、总距离等。
4.程序应该提供可视化的地铁线路图,以帮助用户更好地理解线路。
5.用户可以选择是否考虑换乘时间,并根据需求做相应的计算。
6.用户可以保存自己的常用起始站和目的站,以方便下次使用。
数据结构设计为了实现上述需求,我们需要设计一个合适的数据结构来存储地铁线路图和相关信息。
一个典型的地铁线路图可以表示为一个无向图,其中每个站点表示一个节点,每条线路表示一条边。
下面是一个可能的数据结构设计:1.站点(节点):每个站点包含以下信息:–站点名称–所属线路–经纬度(用于计算站点之间的距离)2.线路(边):每条线路包含以下信息:–起始站点–终点站点–距离3.地铁线路图:地铁线路图由多个站点和线路组成。
可以使用以下数据结构来表示地铁线路图:–站点列表:存储所有的站点信息。
–线路列表:存储所有的线路信息。
–邻接矩阵:用于表示站点之间的连接关系。
邻接矩阵是一个二维数组,其中每个元素表示两个站点之间是否相连。
4.用户信息:用于保存用户的常用起始站和目的站。
可以使用以下数据结构来表示用户信息:–用户列表:存储所有用户的信息。
–常用站点列表:存储每个用户的常用起始站和目的站信息。
算法设计为了计算最短的地铁乘坐线路,我们可以使用图的最短路径算法,例如Dijkstra算法或者A*算法。
数据结构与算法在城市交通优化中的应用指南
![数据结构与算法在城市交通优化中的应用指南](https://img.taocdn.com/s3/m/c548f4137275a417866fb84ae45c3b3567ecdded.png)
数据结构与算法在城市交通优化中的应用指南随着城市化进程的加快,城市交通问题已成为一个亟待解决的难题。
为了实现城市交通的高效、便捷和安全,数据结构与算法的应用成为一种重要的解决方式。
本文将介绍数据结构与算法在城市交通优化中的应用指南,并提供一些实用的建议。
一、介绍城市交通优化是指通过合理的交通规划和优化设计,改善交通流动性,减少拥堵和交通事故,提高交通效率。
而数据结构与算法作为计算机科学中的重要基础,可以为城市交通优化提供有效的数据存储和算法处理的支持。
下面将介绍几种常见的数据结构与算法在城市交通优化中的应用。
二、图论与最短路径算法图论是研究图及其性质的一门学科,而在城市交通中,道路、交叉口、车辆等可以被看作节点,而它们之间的联系则可以用边来表示。
通过构建城市交通的网络图,可以利用图论中的最短路径算法,如Dijkstra算法和Floyd算法,来确定最短路径并指导车辆导航,从而优化城市交通的行驶路线。
三、优先队列与动态路权调度在城市交通中,不同道路的拥堵情况和实时交通状况是不断变化的。
为了能够及时调整交通信号灯的时序,减少交通阻塞,可以利用优先队列来实现动态路权调度。
通过实时更新道路的优先级,可以保证道路上的车辆按照交通状况有序通行,减少交通堵塞和排队等待时间。
四、区域划分与动态规划将城市划分成不同的区域,并为每个区域分配交通资源,是一种常见的城市交通优化方法。
这需要借助数据结构中的区域划分技术,如四叉树或网格划分,将城市分割成不同的块。
同时,通过采用动态规划算法,可以根据不同区域的交通需求和实时交通数据,确定最优的资源分配策略,使得交通流量更加均衡和高效。
五、数据挖掘与交通预测利用数据挖掘技术和机器学习算法可以对城市交通的历史数据进行分析和预测,从而帮助交通管理部门做出相应的决策。
通过对历史交通数据的挖掘和分析,可以找出交通瓶颈、拥堵原因等问题,并提供相应的解决方案。
同时,基于数据挖掘的交通预测模型可以帮助交通管理部门提前做好交通状况预警和资源调度,以应对突发交通事件和拥堵情况。
数据结构课程设计_城市最短路径求解
![数据结构课程设计_城市最短路径求解](https://img.taocdn.com/s3/m/0acc440c16fc700aba68fc00.png)
数据结构课程设计—省会城市最短路径求解一、类关系图说明:Graph类继承Form类,同时嵌入了CityInf结构体和List类。
Graph类的几个重要函数、类、结构体private void Init()//初始化函数private void ShowMap_Paint(object sender, PaintEventArgs e) //绘制地图private bool GetMinDistanceFun(int entry) //采用迪杰斯特拉算法获得最短路径private void BFS(int StartPoint, int[] visited, string name) //广度优先遍历函数private void DFS(int StartPoint, int[] visited, string name)//深度优先遍历函数private void Prim()//求解最小生成树 Prim算法private class List //广度优先遍历用到的队列类public struct CityInf//存放城市信息:城市名称、城市坐标、状态值二、流程图三、主要算法的实现1.用迪杰斯特拉算法实现省会城市间最短路径的求解private bool GetMinDistanceFun(int entry){int inputnodenum = CityData.citysum;int[] Mark = new int[inputnodenum]; //标志位数组标记数据在哪个集合int mindis = 0, nextnode = 0;//最短路径,下一个城市结点int i, j;//第一轮距离数组记录从起始点到其他所有点的边权值for (i = 0; i < inputnodenum; i++){Distance[i] = GetCityWeight(entry, i);//所有标志位清零Mark[i] = 0;//如果起始结点可以抵达某个结点if (i != entry && Distance[i] < MaxWeight){RoutePath[i] = entry; //则把该结点首先放入路径数组}else{RoutePath[i] = -1;//表示该路径不通}}//初始状态下集合存放找到最短路径顶点集合的中只包含源点entry 所以把它在Mark 中标记出来Mark[entry] = 1;//在还没有找到最短路径的结点集合中选取最短距离结点nextnodefor (i = 1; i < inputnodenum; i++){//设定每轮的初始最小距离为无穷大mindis = MaxWeight;for (j = 0; j < inputnodenum; j++){//保证每次循环mindis是到entry的最小值if (Mark[j] == 0 && Distance[j] < mindis)//如果没有进入最短路径且距离小于最小距离{nextnode = j;mindis = Distance[j];//记录本次循环的最短路径}}if (mindis == MaxWeight)//不存在最短路径退出{return false;}//把nexinode在集合mark中标记成已在最短路径集合中Mark[nextnode] = 1;//每加入一个元素都要修改entry到最短路径集合都要再修改entry到剩余顶点的最短路径长度值for (j = 0; j < inputnodenum; j++)//修改结点v0到其他的结点最短的距离{//找到新的最短路径if (Mark[j] == 0 && GetCityWeight(nextnode, j) < MaxWeight&& Distance[nextnode] + GetCityWeight(nextnode, j) < Distance[j]) {//新的最短路径Distance[j] = Distance[nextnode] + GetCityWeight(nextnode, j);//把该点加入路径RoutePath[j] = nextnode;}}}return true;}this.MinTreeEdges[i, j] = 0;}}//辅助数组初始化权值数组赋值for (i = 1; i < this.CityData.citysum; ++i){WeightArrays[i] = this.Edges[0, i];NodeArrays[i] = 0;}//某个顶点加入集合UWeightArrays[0] = 0;NodeArrays[0] = 0;//判断最小的权值通过的顶点的循环就此开始for (i = 0; i < this.CityData.citysum; ++i){k = 1;j = 1;mincost = this.MaxWeight;//选取权值最小的边和相应的顶点while (j < this.CityData.citysum){if (WeightArrays[j] < mincost && WeightArrays[j] != 0){mincost = WeightArrays[j];k = j;}j++;}//新顶点加入集合UWeightArrays[k] = 0;this.MinTreeEdges[k, NodeArrays[k]] = this.Edges[k, NodeArrays[k]];this.MinTreeEdges[NodeArrays[k], k] = this.Edges[k, NodeArrays[k]];//重新计算该顶点到其余顶点的边的权值for (j = 1; j < this.CityData.citysum; j++){if (this.Edges[k, j] < WeightArrays[j]){WeightArrays[j] = this.Edges[k, j];NodeArrays[j] = k;}}}this.Default();this.showmintree = true;this.ShowMap.Refresh();}四、程序测试结果求解两个城市最短路径显示所有城市到“北京”的最短路径求解全国省会城市的公路网的最小生成树“增删”功能“网络地图”功能五、总结本次课程设计收获很大,使用了多种算法:迪杰斯特拉算法、Prim 算法。
- 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);}六、结果分析及算法评价程序主界面及输入起点:输入起点终点输出最短路径:总结分析此次算法的编辑过程,使我熟练的掌握了邻接矩阵存储结构的使用,从另一面了解到迪克斯拉算法,更深刻的意识到清晰的思路能够使程序简单明了。