《数据结构课程设计》最短路径问题实验报告要点 (1)

合集下载

数据结构课程设计报告_最短路径C++

数据结构课程设计报告_最短路径C++

青岛理工大学琴岛学院设计报告课题名称:求解最优交通路径学院:计算机工程系专业班级:计算机科学与技术学号:#######学生:**指导教师:**青岛理工大学琴岛学院教务处2011 年 7 月 7日图1B.具体功能实现及相应的弗洛伊德算法首先,建立查询信息对话框,使用户能够录入需要查询的城市代号,并显示路径长度及最短路径沿途经过的城市。

并相应地添加如下变量int m_v0;int m_v1;int m_lj;CString m_zd;具体代码如下:#define MAXV 25 //最大顶点个数#define INF 32767 //用32767表示∞//以下定义邻接矩阵类型typedef struct{ int no; //顶点编号char name[10]; //顶点名称} VertexType; //顶点类型typedef struct //图的定义{ int edges[MAXV][MAXV]; //邻接矩阵int vexnum,arcnum; //顶点数,弧数VertexType vexs[MAXV]; //存放顶点信息} MGraph; //图的邻接矩阵类型1.通过函数CreatUDN()存放城市路径信息,输入顶点之间的路径长度,创建带权图的邻接矩阵。

void CTDialog::CreatUDN(){MGraph *g=(MGraph*)malloc(sizeof(MGraph));int i,j;for(i=0;i<MAXV;i++) //录入权值,计算存储用for(j=0;j<MAXV;j++){g->edges[i][j]=INF;if(i==j)g->edges[i][j]=0; //初始化置任意两城市之间距离为无穷大,即两城市之间没有直接通路{if(i!=j)m_zd="没有路径";}else if(x==i&&y==j){m_lj=A[i][j];CString zfc;zfc.Format("%d",i); //输出路径上的起点m_zd+=zfc;ppath(path,i,j); //输出路径上的中间点zfc.Format("-->%d",j); //输出路径上的终点m_zd+=zfc;}}}4.输出最短路径函数,递归输出从顶点i到j的最短路径中依次经过的顶点,直到path[i][j]=-1,即没有中间顶点为止。

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

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

青岛理工大学琴岛学院
设计报告
课题名称:数据结构课程设计
学院:计算机工程系
专业班级:计算机网络技术
学号:aaaaaa
学生: aaa
指导教师: aaaaaaa
青岛理工大学琴岛学院教务处
2011 年 12 月 18日
四.调试分析(调试过程中出现的问题及处理方式)调试出现的界面
1)进入程序弹出查询信息对话框如图2:
图2
2) 输入查询信息,显示路径长度及最短路径,如果输入代号不在0~24之内,提示出错。

图3
图4
B.出现的问题及解决方式
1、在执行程序的时候不能显示最短的距离
解决方法:增加一个函数调用,调用的函数为ShortestPath(v0); /*计算两个城市之间的最短路径*/
2、不能连续查询,即查询一次完成后,必须重新运行才能就进行二次查询
解决方法:在代码中添加while( ) 语句printf("是否继续,1(继续查询),0(退出查询)");
printf("\n"); scanf("%d",&ch); 详见图5
图 5。

数据结构课程设计实验报告

数据结构课程设计实验报告

《数据结构》实验报告◎实验题目: 数据结构课程设计(无向连通网的问题求解)◎实验目的:通过本次课程设计,掌握无向连通网的性质,熟悉其关于最短哈密尔顿回路以及最短路径的求解。

◎实验内容:对于具有n(n>=10)个顶点的无向连通网,设计一个算法(1)找出网中最短的哈密尔顿回路;(2)找出任意两个顶点之间的最短路径,须经过指定1个或2个顶点。

一、需求分析1.本演示程序中,输入的无向连通网为任意给定的,输入时应该给定无向连通网的大小、范围,即顶点数以及边数,而输出有三个问题的求解答案,分别输出其路径及权值大小。

2.本演示程序为人机对话,用户可以按照提示进行输入,然后选择需要求解的问题,则有结果输出。

3.程序执行的命令包括:(1)构建无向连通网(2)选择求解问题序号(3)第一个为求解最短哈密顿回路(3)第二个为求解任意两点之间的最短路径,须经过指定1个顶点(4)第三个为求解任意两点之间的最短路径,须经过指定2个顶点(5)结束4.测试数据:(1)请输入顶点数和边数(输入格式为:顶点数,边数):11,17(2)请输入顶点信息(输入格式为:顶点号):0 1 2 3 4 5 6 7 8 9 10(3)请输入每条边对应的两个顶点号及其权值(输入格式为:顶点,顶点,权值:):0,6,50,7,40,4,31,4,11,6,81,3,22,4,62,3,32,10,73,5,85,10,35,9,86,7,17,8,47,9,68,9,29,10,6(4)请选择操作:<1>如果选择输入为1,结果为:最短哈密尔顿回路为:0->6->7->8->9->5->10->2->3->1->4->0权值为:5+1+4+2+8+3+7+3+2+1+3=39<2>如果选择输入为2,结果为:请输入指定起始点:0请输入指定终点:6请输入路径经过指定的顶点:10输出路径是:0->4->2->10->9->7->6起始点为0终点为6的经过指定点10的最短路径为:29<3>如果选择输入为3,结果为:请输入指定起始点:4请输入指定终点:1请输入路径经过指定的顶点一:8请输入路径经过指定的顶点二:3输出路径是:4->1->3->1->6->7->8->7->6->1起始点为4终点为1的经过指定点一8以及指定点二3的最短路径为:31<4>如果选择输入为0,结果为:结束.二概要设计为了实现上述操作,无向连通网用邻接矩阵存储结构,解决哈密顿回路问题时应用栈。

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

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

数据结构与算法课程设计报告书题目:导航最短路径查询班级: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) //输出相应选择的起点和终点的最短路。

数据结构课程设计最短路径问题实验报告

数据结构课程设计最短路径问题实验报告

目录交通咨询系统设计(最短路径问题)一、概述在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。

在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。

这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从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月 3 日数据结构课程设计一、问题描述(1)题目内容:有n个村庄,现要从这n个村庄中选择一个村庄新建一所医院,使其余的村庄到这所医院的距离总和来说较短。

(n>=5)(2)基本要求:(3)可以输出每一对点间的路径长度;然后选取偏心度,最小的偏心度即为所求。

二、需求分析(4)本程序的功能包括找出每一对点间的路径长度。

(5)然后算出每一对点的偏心度。

(6)其中最小的偏心度即为所求。

三、概要设计操作集合:(7)public:MGraph(DataType a[],int b[][MaxSize],int n,int e);//初始化邻接矩阵和路径(8)void Floyd();//弗洛伊德算法的实现(9)void getE();//获取偏心度(10)void showdist();//把每一对顶点之间的路径权值show出来(11)~MGraph(){} //类的析构函数四、数据结构设计(1)DataType vertex[MaxSize];//存放图中顶点的数组(2)intarc[MaxSize][MaxSize];//存放图中边的数组(3)string path[MaxSize][MaxSize];//存放从Vi到Vj的最短路径,初始为//path[i][j]=“ViVj”(4)int dist[MaxSize][MaxSize];//存放求得的最短路径长度(5)int vertexNum, arcNum;//图的顶点数和边数(6)int E[MaxSize][2];//获取最小偏心度和该顶点五、算法设计1.算法分析1)对带权有向图的,调用Floyd算法,对每一对顶点间的最短路径长度的矩阵;2)对最短路径长度矩阵的每列求最大值,即得到各点的偏心度;3)具有最小偏心度的顶点即为所求。

最短距离问题数据结构课程设计报告

最短距离问题数据结构课程设计报告

数据结构课程设计报告题目:北海公园主要游览景点之间最短距离问题一、课程设计题目:北海公园主要游览景点之间最短距离问题二、问题定义:(由教师指定)图的最短路径问题是指从指定的某一点v开始,求得从该地点到图中其它各地点的最短路径。

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

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

三、需求分析1、设计北海公园的平面图。

选取若干个有代表性的景点抽象成一个无向带权图,以图中顶点表示公园内各景点,边上的权值表示两景点之间的距离。

2、输入的形式:整型数字输入值的范围:0-103、输出的形式:由二元组表示以邻接矩阵存储的图4、程序所能达到的功能;(1)输出顶点信息:将公园内各景点输出。

(2)输出边的信息:将公园内每两个位置的距离输出。

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

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

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

5、算法涉及的基本理论分析:定义邻接矩阵adjmatrix;自定义顶点结构体V ertexType;定义邻接表中的边结点类型edgenode;switch算法;狄克斯特拉法(Dijkstra)求任意两结点之间的最短路径;6、题目研究和实现的价值。

四、算法设计1、概要设计(1)存储结构设计本系统采用图结构类型存储抽象北海公园地图的信息。

其中:各景点间的邻接关系用图的邻接矩阵类型(adjmatrix)存储;景点(顶点)信息用结构数组(V ertexType)存储,其中每个数组元素是一个结构变量,包含景点编号、景点名称两个分量;图的顶点个数由分量MaxV ertexNum表示,它是整型数据。

(2)主界面设计为了实现公园导游系统各功能的管理,首先设计一个含有多个菜单项的主控菜单子程序以链接系统的各项子功能,方便用户使用本系统。

数据结构迷宫最短路径实验报告

数据结构迷宫最短路径实验报告

实验报告课程名:数据结构(C语言版)实验名:迷宫问题II姓名:班级:学号:撰写时间:2014/10/10一实验目的与要求1. 了解栈的应用2. 利用栈在迷宫中找到一条路二实验内容•一个迷宫如图1所示, 是由若干个方格构成的一个矩形, 其中有唯一的一个入口(用⃝标示), 有唯一的一个出口(用△标示). 图中深色的方格无法到达, 浅色的方格都是可以到达的. 每一次只能从当前方格前进到与当前方格有公共边的方格中(因此前进方向最多有四个).•本次实验的迷宫问题要求找到从入口到出口的最短的路.图1:迷宫三实验结果与分析程序:#include <stdio.h>#include <stdlib.h>int Maze(int ox,int oy,int ex,int ey,int rnum,int cnum,int a[rnum][cnum]){int b[rnum][cnum];int i,j,Znum=0;for(i=0;i<rnum;++i){for(j=0;j<cnum;++j){b[i][j]=a[i][j];if(a[i][j]==0){Znum=Znum+1;}}}int Qx[Znum+1], Qy[Znum+1], P[Znum+1], head=0, tail=0; for(i=0;i<Znum+1;++i){Qx[i]=-10;Qy[i]=-10;P[i]=-10;}/*int dx[4] = {0,1,0,-1};int dy[4] = {-1,0,1,0};int neighbor_num = 4;*/int dx[8] = {-1, 0, 1,1,1,0,-1,-1};int dy[8] = {-1,-1,-1,0,1,1, 1, 0};int neighbor_num = 8;if(ox==ex && oy==ey){printf("(%d,%d)",ox,oy);}else{Qx[tail]=ox;Qy[tail]=oy;P[tail]=-1;++tail;b[ox][oy]=2;}int brand = -1;while(tail>head){for(i=0;i<neighbor_num;i++){int tx = Qx[head]+dx[i];int ty = Qy[head]+dy[i];if(b[tx][ty]==0){if(tx==ex && ty==ey){printf("(%d,%d), ",tx,ty);int t = head;while(t>=0){printf("(%d,%d), ",Qx[t],Qy[t]);t=P[t];}head=tail;brand=1;break;}else{Qx[tail]=tx;Qy[tail]=ty;P[tail]=head;++tail;b[tx][ty]=2;}}}++head;}return(brand);}int main(int argc, char *argv[]) {int rnum = 10;int cnum = 10;int a[10][10]={{1,1,1,1,1,1,1,1,1,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,1,0,0,0,1,0,1},{1,0,0,0,0,1,1,0,0,1},{1,0,1,1,1,0,0,0,0,1},{1,0,0,0,1,0,0,0,0,1},{1,0,1,0,0,0,1,0,0,1},{1,0,1,1,1,0,1,1,0,1},{1,1,0,0,0,0,0,0,0,1},{1,1,1,1,1,1,1,1,1,1}};//假设外面有一层不可到达的方块,故迷宫成了10乘10型int ox=1,oy=1,ex=rnum-2,ey=cnum-2;int brand = Maze(ox,oy,ex,ey,rnum,cnum,a);if(brand<0){printf("There is no way\n");}return 0;}图1:实验结果截图。

数据结构实验报告十一—最短路径问题

数据结构实验报告十一—最短路径问题

问题描述:若用有向网表示某地区的公路交通网,其中顶点表示该地区的一些主要场所,弧表示已有的公交线路,弧上的权表示票价。

试设计一个交通咨询系统,指导乘客以最少花费从该地区中的某一场所到达另一场所。

基本要求:(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算法。

实验报告6-最短路径问题

实验报告6-最短路径问题

HUNAN UNIVERSITY 课程实习报告题目最短路径问题学生姓名学生学号专业年级指导老师完成日期一、需求分析本实验是求最短路径的问题,从文件中读入有向网中顶点的数量和顶点间的票价的矩阵,以用户指定的起点,在文件中输出到其余各顶点的最短路径及花费。

(1)输入:输入的形式:(文件)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输入值的范围:文件输入中,顶点数和矩阵中顶点间的票价均为整型int,用户输入中,起点数为整型int。

(2)输出的形式:(文件)源点0到顶点1的最小花费为:5路径为:0——>2——>1源点0到顶点2的最小花费为:3路径为:0——>2源点0到顶点3的最小花费为:10路径为:0——>2——>1——>3源点0到顶点4的最小花费为:18路径为:0——>2——>4(3)程序所达到的功能:在文件中给出有向网的顶点个数和顶点间的票价的矩阵,以用户指定的起点,在文件中输出起点到其余各顶点的最短路径及花费。

(4)测试数据:a.输入:(文件)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输出:(文件)源点0到顶点1的最小花费为:5路径为:0——>2——>1源点0到顶点2的最小花费为:3路径为:0——>2源点0到顶点3的最小花费为:10路径为:0——>2——>1——>3源点0到顶点4的最小花费为:18路径为:0——>2——>4b.输入:(文件)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(用户)输入起点:2输出:(文件)源点2到顶点0:没有连通路径源点2到顶点1的最小花费为:2路径为:2——>1源点2到顶点3的最小花费为:7路径为:2——>1——>3源点2到顶点4的最小花费为:15路径为:2——>4c.输入:(文件)618 10 3 20 -1 915 -1 -1 5 -1 -1-1 20 16 -1 -1 15-1 -1 30 -1 6 32 9 -1 20 -1 -1-1 8 12 -1 -1 5(用户)输入起点:5输出:(文件)源点5到顶点0的最小花费为:21路径为:5——>1——>3——>4——>0源点5到顶点1的最小花费为:8路径为:5——>1源点5到顶点2的最小花费为:12路径为:5——>2源点5到顶点3的最小花费为:13路径为:5——>1——>3源点5到顶点4的最小花费为:19路径为:5——>1——>3——>4d.输入:(文件)618 10 3 20 -1 915 -1 -1 5 -1 -1-1 20 16 -1 -1 15-1 -1 30 -1 6 32 9 -1 20 -1 -1-1 8 12 -1 -1 5(用户)输入起点:3输出:(文件)源点3到顶点0的最小花费为:8路径为:3——>4——>0源点3到顶点1的最小花费为:11路径为:3——>5——>1源点3到顶点2的最小花费为:11路径为:3——>4——>0——>2源点3到顶点4的最小花费为:6路径为:3——>4源点3到顶点5的最小花费为:3路径为:3——>5e.输入:(文件)3-1 -1 -1-1 -1 -1-1 -1 -1(用户)输入起点:1输出:(文件)源点1到顶点0:没有连通路径源点1到顶点2:没有连通路径f.输入:(文件)3-1 -1 -1-1 -1 -1-1 -1 -1(用户)输入起点:3输出:(文件)源点3到顶点0的最小花费为:-572562307路径为:3——>1——>0源点3到顶点1的最小花费为:-572662307路径为:3——>1源点3到顶点2的最小花费为:-572662307路径为:3——>2二、概要设计(1)所有抽象数据类型的定义:const int MaxNum=100000;//利用邻接矩阵存储图:class Graph{private:int *Adj;//保存邻接矩阵的一维数组j和k之间权值存储在Adj[j*Num+k]中int Num;public:Graph();~Graph();void Floyd(int start);};(2)算法的基本思想:采用邻接矩阵为图的存储结构,保存邻接矩阵的一维数组j和k之间权值存储Adj[j*Num+k]中,以用户指定的起点,进行弗洛伊德算法,先初始化最短路径,对角线元素设置为0,其他元素设置为边的权值,没有有向边设置为MaxNum,依次插入中间点k,判断是否检查Dis(i,k) + Dis(k,j) < Dis(i,j)是否成立,若不成立则路径不改变,若成立则更新最短路径,设置Dis(i,j) = Dis(i,k) + Dis(k,j),直至循环结束,更新后的最短路径入栈,在文件中输出到其余各顶点的最短路径及花费。

数据结构实验报告 最短路径

数据结构实验报告 最短路径

实验报告实验名称最短路径课程名称数据结构与算法实验||专业班级:信息安全学号:姓名:实验六最短路径一、实验目的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;}四、实验结果五、实验总结本次实验主要是学习掌握图的存储结构,学会编写求最短路径的算法。

求最短路径的实验报告

求最短路径的实验报告

《求最短路径的实验报告》1.需解决的的问题创建一个网的存储结构,并求最短路径2.数据结构的定义typedef struct{VertexType vexs[MVNum]; //顶点数组,类型假定为char型Adjmatrix arcs[MVNum][MVNum]; //邻接矩阵,类型假定为int型}MGraph;int D1[MVNum],P1[MVNum];int D[MVNum][MVNum],P[MVNum][MVNum];3.程序的结构图4.函数的功能(1)迪杰斯特拉算法void Dijkstra(MGraph *G,int v1,int n){ //用迪杰斯特拉算法求有向图G的v1顶点到其他顶点v的最短路径P[v]和其权D[v] //设G是有向图的邻接矩阵,若边<i,j>不存在,则G[i][j]=Maxint//S[v]为真当且仅当v在S中int D2[MVNum],P2[MVNum];int v,i,w,min;enum boolean S[MVNum];for(v=1;v<=n;v++){//初始化S和DS[v]=FALSE; //设置最短路径终点集D2[v]=G->arcs[v1][v]; //设置初始的最短路径值if(D2[v]<Maxint)P2[v]=v1; //v1是v的前驱elseP2[v]=0; //v无前驱}D2[v1]=0;S[v1]=TURE; //S集初始时只有源点,源点到其自身的距离为0//开始循环,每次求得v1到某个v顶点的最短路径,并加v到S集中for(i=2;i<n;i++){min=Maxint;for(w=1;w<=n;w++)if(!S[w]&&D2[w]<min){ //w顶点离v1顶点更近v=w;min=D2[w];}S[v]=TURE;for(w=1;w<=n;w++) //更新当前最短路径及距离if(!S[w]&&(D2[v]+G->arcs[v][w]<D2[w])){ //修改D2[w]和P2[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");}}(2)费洛伊德算法void Floyd(MGraph *G,int n){int i,j,k,v,w;for(i=1;i<=n;i++) //设置路径长度D和路径path初值for(j=1;j<=n;j++){if(G->arcs[i][j]!=Maxint)P[i][j]=j; //j是i的后继elseP[i][j]=0;D[i][j]=G->arcs[i][j];}for(k=1;k<=n;k++){ //做k次迭代,每次均试图将顶点k扩充到当前求得的从i到j的最短路径P[i][j]上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];printf("dij=%d,pij=%d\n",D[i][j],P[i][j]);}}}}5.输入/输出数据1.测试第一个无边图2.测试第二个有向图测试均满足题目条件。

数据结构课程设计报告Dijkstra算法求最短路径

数据结构课程设计报告Dijkstra算法求最短路径
3.4邻接矩阵的显示---------------------------------------------------------------------------9
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)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。

在有向图中输入错误的数据(顶点与顶点方向相反),会输出逆向信息。

【数据结构算法】实验8-图的最短路径问题(附源代码)

【数据结构算法】实验8-图的最短路径问题(附源代码)

【数据结构算法】实验8-图的最短路径问题(附源代码)浙江大学城市学院实验报告课程名称数据结构与算法实验项目名称实验八图的最短路径问题实验成绩指导老师(签名)日期一.实验目的和要求1.掌握图的最短路径概念。

2.理解并能实现求最短路径的DijKstra算法(用邻接矩阵表示图)。

二. 实验内容1、编写用邻接矩阵表示有向带权图时图的基本操作的实现函数,基本操作包括:① 初始化邻接矩阵表示的有向带权图void InitMatrix(adjmatrixG);② 建立邻接矩阵表示的有向带权图 void CreateMatrix(adjmatrix G, int n) (即通过输入图的每条边建立图的邻接矩阵);③ 输出邻接矩阵表示的有向带权图void PrintMatrix(adjmatrix G, int n) (即输出图的每条边)。

把邻接矩阵的结构定义以及这些基本操作函数存放在头文件Graph2.h中。

2、编写求最短路径的DijKstra算法函数 void Dijkstra( adjmatrix GA, int dist[], edgenode *path[], int i, int n) ,该算法求从顶点i到其余顶点的最短路径与最短路径长度,并分别存于数组path 和dist 中。

编写打印输出从源点到每个顶点的最短路径及长度的函数void PrintPath(int dist[], edgenode *path[], int n)。

3、编写测试程序(即主函数),首先建立并输出有向带权图,然后计算并输出从某顶点v0到其余各顶点的最短路径。

要求:把指针数组的基类型结构定义edgenode、求最短路径的DijKstra算法函数、打印输出最短路径及长度的函数PrintPath以及主函数存放在文件test9_2.cpp中。

测试数据如下:4、填写实验报告,实验报告文件取名为report8.doc。

5、上传实验报告文件report8.doc与源程序文件test9_2.cpp及Graph2.h到Ftp服务器上自己的文件夹下。

(完整word版)《数据结构课程设计》最短路径问题实验报告要点

(完整word版)《数据结构课程设计》最短路径问题实验报告要点

一、概述 (1)二、....................... 系统分析1三、....................... 概要设计2四、....................... 详细设计54.1建立图的存储结构 (5)4.2单源最短路径 (6)4.3任意一对顶点之间的最短路径 (7)五、运行与测试 (8)参考文献 (11)附录12交通咨询系统设计(最短路径问题)一、概述在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。

在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。

这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从A城到B城途中中转次数最少;如何选择一条路径使得从A城到B城里程最短;如何选择一条路径使得从A城到B城花费最低等等的一系列问题。

二、系统分析设计一个交通咨询系统,能咨询从任何一个城市顶点到另一城市顶点之间的最短路径(里程)、最低花费或是最少时间等问题。

对于不同的咨询要求,可输入城市间的路程、所需时间或是所需费用等信息。

针对最短路径问题,在本系统中采用图的相关知识,以解决在实际情况中的最短路径问题,本系统中包括了建立图的存储结构、单源最短问题、对任意一对顶点间最短路径问题三个问题,这对以上几个问题采用了迪杰斯特拉算法和弗洛伊德算法。

并未本系统设置一人性化的系统提示菜单,方便使用者的使用。

二、概要设计可以将该系统大致分为三个部分:①建立交通网络图的存储结构;②解决单源最短路径问题;③实现两个城市顶点之间的最短路径问题。

交通咨询系统迪杰斯特拉算法(单源最短路径)费洛依德算法(任意顶点对间最短路迪杰斯特拉算法流图:弗洛伊德算法流图:四、详细设计4.1建立图的存储结构定义交通图的存储结构。

邻接矩阵是表示图形中顶点之间相邻关系的矩阵。

设G=(V,E)是具有n个顶点的图,贝S G的邻接矩阵是具有如下定义的n阶方阵。

数据结构实验报告-最短路径

数据结构实验报告-最短路径

最短路径
--《数据结构实验报告》
1.基本思想
最短路径,顾名思义,就是两个点之间的最短距离。

本实验采用Dijkstra算法和Floyd算法。

Dijkstra算法和Prim算法思想很像,都是一种贪心的算法。

Dijkstra算法只能算出一个点到其他点的最短距离,而Floyd算法一次可以算出各点之间的最短距离。

2.用到的数据结构
邻接矩阵G表示图。

Dijkstra:
数组D[n]表示源点到其他点的最短距离,数组P[n]表示最后经过的上一个顶点。

Floyd:
A[n][n]存放迭代过程中的最短路径长度。

3.基本操作实现
Dijkstra:将V分为两个集合S和V-S,初始D[i]=C[1][i],P[i]=1。

从S外选取一个顶点w,是D[w]最小,于是从源点到达w中通过S中的顶点,且是一条最短路径,w加入S,从原来的D[v]和D[w]+C[w][v]中选择最小值作为D[v]新值,且P[v]=w,重复以上步骤。

Floyd:将每一个顶点都尝试着插入到两个顶点之间,若插入之后得到的路径长度小于插入之前,则保留插入点,将每一个点都尝试插入,得到最终的最短路径。

4.测试数据及测试结果
Dijkstra:
测试数据:
测试结果:
(输入节点,下面输出这个节点到源点0的最短路径)
Floyd:
测试数据:
测试数据:
生成的距离矩阵。

数据结构课程设计报告-最短路径算法-二叉树的三种遍历

数据结构课程设计报告-最短路径算法-二叉树的三种遍历

数据结构课程设计报告班级:计算机科学与技术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) 程序要添加适当的注释,程序的书写要采用缩进格式。

最短路径问题实验报告

最短路径问题实验报告

徐州工程学院管理学院实验报告实验课程名称:最短路径问题实验地点:南主楼七楼机房经济管理实验中心 2015 年 5 月至 2015 年 6 月},n;之间最短路时,每次都要计算i V 经过节点r V 到达点j V 的路长不会比原来的短,于是不用再计(1)1k k ir rjd d --+,进入下一个节点的搜索。

对于问题(2),构造一个序号矩阵()()k k ij A a =,(0,1,)k =,记录算法第二步中第k次迭代插入节点的情况.优化后的Floyd 算法(记为算法2)如下:第一步,作初始距离矩阵(0)(0)()ij D d =和序号矩阵(0)0)()ij A a =(,其中:(0),,(,1,2,3,),ij ij W i j d i j n i j ⎧==⎨∞⎩相邻对,,不相邻或无路时, (0)0,,,1,2,,,ij i j a i j n i j ⎧==⎨Φ⎩相邻时,(),不相邻或无路, 此时距离矩阵(0)D 中的元素(0)ij d 表示任意两点i V 、j V 不经过其它节点的路长。

第二步,构造迭代矩阵()()()k k ij D d =和序号矩阵(0))()k ij A a =(。

① 对于迭代矩阵()k D 的元素()k ij d : r 从1到n ,且,r i j ≠时,如果(1)(1)k k ir ijd d --≥或(1)(1)k k ri ij d d --≥,说明插入点r V 后路长(1)k ij d -不会变短,此时无须计算(1)1k k ir rjd d --+。

否则{}()(1)(1)(1)min ,k k k k ij ij ir rj d d d d ---=+。

② 相应地,序号矩阵()k A 的各元素变化为:若()(1)(1)k k k ij il lj d d d --=+,且(1)(1)k k ir rjd d --<,则记下点l V ,并在序号矩阵中()k A 对应的元素)k ij a (变为:{}()(1)(1),,k k k ij il l lj a a V a --=。

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

数据结构课程设计报告设计题目:最短路径的应用专业:软件工程班级:软件182姓名:阿力木·艾尔肯学号:**********指导教师:***起止时间:2019.12.30-2020.1.32019 年秋季学期数据结构课程设计任务书14题目:最短路径的应用问题描述:现有10个城市之间的交通信息,若有火车,则提供两个城市之间火车票价格。

(1)有旅客A,准备从城市A出发到城市B,他希望总想花费最少。

试设计一种方案。

(2)有旅客B,准备从城市A出发到城市B,他想转车次数最少。

试设计一种方案。

目录一、概述 (1)二、系统分析 (1)三、概要设计 (2)四、详细设计 (5)4.1建立图的存储结构 (5)4.2单源最短路径 (6)4.3任意一对顶点之间的最短路径 (7)五、运行与测试 (8)参考文献 (12)附录 (13)交通咨询系统设计(最短路径问题)一、概述在交通网络日益发达的今天,针对人们关心的各种问题,利用计算机建立一个交通咨询系统。

在系统中采用图来构造各个城市之间的联系,图中顶点表示城市,边表示各个城市之间的交通关系,所带权值为两个城市间的耗费。

这个交通咨询系统可以回答旅客提出的各种问题,例如:如何选择一条路径使得从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 的信息)。

邻接矩阵的存储结构:#define MVNum 100 //最大顶点数 typedef struct {VertexType vexs[MVNum];//顶点数组,类型假定为char 型 Adjmatrix arcs[MVNum][MVNum];//邻接矩阵,假定为int 型 }MGraph;注:由于有向图的邻接矩阵是不对称的,故程序运行时只需要输入所有有向边及其权值即可。

4.2单源最短路径单源最短路径问题:已知有向图(带权),期望找出从某个源点S ∈V到G中其余各顶点的最短路径。

迪杰斯特拉算法即按路径长度递增产生诸顶点的最短路径算法。

算法思想:设有向图G=(V,E),其中V={1,2,……n},cost是表示G的邻接矩阵,cost[i][j]表示有向边<i,j>的权。

若不存在有向边<i,j>,则cost[i][j] 的权为无穷大(这里取值为32767)。

设S是一个集合,集合中一个元素表示一个顶点,从源点到这些顶点的最短距离已经求出。

设顶点V1为源点,集合S的初态只包含顶点V1。

数组dist记录从源点到其它各顶点当前的最短距离,其初值为dist[i]= cost[i][j],i=2,……n。

从S之外的顶点集合V-S中选出一个顶点w,使dist[w] 的值最小。

于是从源点到达w只通过S中的顶点,把w加入集合S中,调整dist中记录的从源点到V-S中每个顶点v的距离:从原来的dist[v]和dist[w]+cost[w][v]中选择较小的值作为新的dist[v]。

重复上述过程,直到S中包含V中其余顶点的最短路径。

最终结果是:S记录了从源点到该顶点存在最短路径的顶点集合,数组dist记录了从源点到V中其余各顶点之间的最短路径,path是最短路径的路径数组,其中path[i]表示从源点到顶点i之间的最短路径的前驱顶点。

4.3任意一对顶点之间的最短路径任意顶点对之间的最短路径问题,是对于给定的有向网络图G=(V,E),要对G中任意一对顶点有序对,“V,W(V≠W)”,找出V到W 的最短路径。

而要解决这个问题,可以依次把有向网络图中每个顶点作为源点,重复执行前面的迪杰斯特拉算法n次,即可求得每对之间的最短路径。

费洛伊德算法的基本思想:假设求从V i到V j的最短路径。

如果存在一条长度为arcs[i][j]的路径,该路径不一定是最短路径,还需要进行n次试探。

首先考虑路径<v i,v1>和<v1,v j>是否存在。

如果存在,则比较路径<v i.v j>和<v i,v1,v j>的路径长度,取长度较短者为当前所求得。

该路径是中间顶点序号不大于1的最短路径。

其次,考虑从v i到v j是否包含有顶点v2为中间顶点的路径< v i,…,v2,…,v j>,若没有,则说明从v i到v j的当前最短路径就是前一步求出的;若有,那么<v i,…,v2,…,v j>可分解为<v i,…,v2>和<v2,…,v j>,而这两条路径是前一次找到的中间点序号不大于1的最短路径,将这两条路径长度相加就得到路径<v i,…,v2,…v j>的长度。

将该长度与前一次中求得的从v i到v j的中间顶点序号不大于1的最短路径比较,取其长度较短者作为当前求得的从v i到v j的中间顶点序号不大于2的最短路径。

依此类推……直至顶点v n加入当前从v i到v j的最短路径后,选出从v i到v j的中间顶点序号不大于n的最短路径为止。

由于图G中顶点序号不大于n,所以v i到v j的中间顶点序号不大于n的最短路径,已考虑了所有顶点作为中间顶点的可能性,因此,它就是v i到v j的最短路径。

五、运行与测试数据:1,3,6953,1,6951,4,7044,1,7041,2,10842,1,10842,3,5113,2,5112,5,8125,2,8123,4,3494,3,3493,6,15796,3,15794,7,6517,4,6515,6,15766,5,15766,7,13857,6,13852,8,6908,2,6905,8,10008,5,10008,9,19229,8,19225,9,28629,5,28629,10,146210,9,1462测试实例2:利用下图求交通网络图(无向图)的最短路径。

19222862实例1运行结果:5473612704812 5111576 13851579695349651 成都广州西安北京郑州上海徐州10848910 00兰州乌鲁木齐喀什1462 6901000实例2运行结果:六、总结与心得该课程设计主要是从日常生活中经常遇到的交通网络问题入手,进而利用计算机去建立一个交通咨询系统,以处理和解决旅客们关心的各种问题(当然此次试验最终主要解决的问题是:最短路径问题)。

这次试验中我深刻的了解到了树在计算机中的应用是如何的神奇与灵活,对于很多的问题我们可以通过树的相关知识来解决,特别是在解决最短路径问题中,显得尤为重要。

经过着次实验,我了解到了关于树的有关算法,如:迪杰斯特拉算法、弗洛伊德算法等,对树的学习有了一个更深的了解。

参考文献【1】《数据结构》严蔚敏.清华大学出版社.【2】《数据结构课程设计》苏仕华.极械工业出版社.【3】《数据结构课程设计》中国工信出版社电子工业出版社【4】百度文库【5】CSDN 论坛附录#include<stdio.h>#include<stdlib.h>#define MVNum 1000#define Maxint 32767enum boolean{FALSE,TRUE};typedef char VertexType;typedef int Adjmatrix;typedef struct{VertexType vexs[MVNum];Adjmatrix arcs[MVNum][MVNum];}MGraph;int D1[MVNum],p1[MVNum];int D[MVNum][MVNum],p[MVNum][MVNum]; void CreateMGraph(MGraph * G,int n,int e){int i,j,k,w,v=1;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条边的i.j及w:\n",e);for(k=1;k<=e;k++){scanf("%d,%d,%d",&i,&j,&w);G->arcs[i][j]=w;}printf("有向图的存储结构建立完毕!\n"); }void Dijkstra(MGraph *G,int v1,int n){int D2[MVNum],p2[MVNum];int v,i,w,min;enum boolean S[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",D2[i]/2);printf("%5d",i);v=p2[i];while(v!=0){printf("<-%d",v);v=p2[v];}printf("\n");}}void Floyd(MGraph *G,int n){int i,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];}}}}void main(){system("color 3f");MGraph *G;int m,n,e,v,w,k;int xz=1;G=(MGraph *)malloc(sizeof(MGraph));printf("\n中国铁路12306\n");printf("___________________________________________________________ _____________________________________________\n");printf("设计地图\n\n\n");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");}。

相关文档
最新文档