最短路径规划实验报告

合集下载

最短路径的实验报告

最短路径的实验报告

最短路径的实验报告最短路径的实验报告引言:最短路径问题是图论中一个经典的问题,涉及到在一个带有权重的图中找到两个顶点之间的最短路径。

本实验旨在通过实际操作和算法分析,深入探讨最短路径算法的性能和应用。

实验设计:本次实验使用了Dijkstra算法和Floyd-Warshall算法来解决最短路径问题。

首先,我们使用Python编程语言实现了这两个算法,并对它们进行了性能测试。

然后,我们选择了几个不同规模的图进行实验,以比较这两种算法的时间复杂度和空间复杂度。

最后,我们还在实际应用中使用了最短路径算法,以验证其实用性。

实验过程:1. 实现Dijkstra算法Dijkstra算法是一种贪心算法,用于求解单源最短路径问题。

我们首先实现了该算法,并对其进行了性能测试。

在测试中,我们使用了一个包含1000个顶点和5000条边的图,记录了算法的运行时间。

结果显示,Dijkstra算法的时间复杂度为O(V^2),其中V表示图中的顶点数。

2. 实现Floyd-Warshall算法Floyd-Warshall算法是一种动态规划算法,用于求解所有顶点对之间的最短路径。

我们在Python中实现了该算法,并对其进行了性能测试。

在测试中,我们使用了一个包含100个顶点和5000条边的图,记录了算法的运行时间。

结果显示,Floyd-Warshall算法的时间复杂度为O(V^3),其中V表示图中的顶点数。

3. 比较两种算法通过对Dijkstra算法和Floyd-Warshall算法的性能测试,我们可以看到,Dijkstra算法在处理较大规模的图时性能更好,而Floyd-Warshall算法在处理较小规模的图时性能更好。

因此,在实际应用中,我们可以根据图的规模选择合适的算法。

4. 应用实例为了验证最短路径算法的实际应用性,我们选择了一个城市交通网络图进行实验。

我们使用了Dijkstra算法来计算两个城市之间的最短路径,并将结果与实际的驾车时间进行比较。

最短路径规划实验报告

最短路径规划实验报告

1.实验题目:单源最短路径的dijkstra解法两点间最短路径的动态规划解法Dijkstra算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径。

主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

Dijkstra算法是很有代表性的最短路径算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。

注意该算法要求图中不存在负权边。

问题描述:在无向图G=(V,E) 中,假设每条边E[i] 的长度为w[i],找到由顶点V0 到其余各点的最短路径。

(单源最短路径)2.算法描述:1)算法思想:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径, 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。

在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v 到U中任何顶点的最短路径长度。

此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

2)算法步骤:a.初始时,S只包含源点,即S={v},v的距离为0。

U包含除v外的其他顶点,即:U={其余顶点},若v与U中顶点u有边,则<u,v>正常有权值,若u不是v的出边邻接点,则<u,v>权值为∞。

b.从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

c.以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

d.重复步骤b和c直到所有顶点都包含在S中。

实验三最短路径的算法(离散数学实验报告)

实验三最短路径的算法(离散数学实验报告)

实验三最短路径的算法(离散数学实验报告)实验3:最短路径算法⼀、实验⽬的通过本实验的学习,理解Floyd(弗洛伊得)最短路径算法的思想⼆、实验内容⽤C语⾔编程实现求赋权图中任意两点间最短路径的Floyd算法,并能对给定的两结点⾃动求出最短路径三、实验原理、⽅法和⼿段1、Floyd算法的原理定义:Dk[i,j] 表⽰赋权图中从结点vi出发仅通过v0,v1,┉,vk-1中的某些结点到达vj的最短路径的长度,若从vi到vj没有仅通过v0,v1,┉,vk-1 的路径,则D[i,j]=∝即D-1[i,j] 表⽰赋权图中从结点vi到vj的边的长度,若没有从结点vi到vj的边,则D[i,j]=∝D0[i,j] 表⽰赋权图中从结点vi到vj的”最短”路径的长度, 这条路上除了可能有v0外没有其它结点D1[i,j] 表⽰赋权图中从结点vi到vj的”最短”路径的长度, 这条路上除了可能有v0,v1外没有其它结点┉┉┉根据此定义,D k[i,j]=min{ D k-1[i,j] , D k-1[i,k-1]+D k-1[k-1,j] }定义:path[i,j]表⽰从结点vi到vj的“最短”路径上vi的后继结点四、实验要求要求输出每对结点之间的最短路径长度以及其最短路径五、实验步骤(⼀)算法描述Step 1 初始化有向图的成本邻矩阵D、路径矩阵path若从结点vi到vj有边,则D[i,j]= vi到vj的边的长度,path[i,j]= i;否则D[i,j]=∝,path[i,j]=-1Step 2 刷新D、path 对k=1,2,┉n 重复Step 3和Step 4Step 3 刷新⾏对i=1,2,┉n 重复Step 4Step 4 刷新Mij 对j=1,2,┉n若D k-1[i,k]+D k-1[k,j][结束循环][结束Step 3循环][结束Step 2循环]Step 5 退出(⼆)程序框图参考主程序框图其中,打印最短路径中间结点调⽤递归函数dist(),其框图如下,其中fist,end是当前有向边的起点和终点dist(int first, int end)七、测试⽤例:1、输⼊成本邻接矩阵:D :06380532290141003210∝∝∝∝V V V V V V V V (其中∝可⽤某个⾜够⼤的数据值代替,⽐如100)可得最短路径矩阵:P :131132122211111010103210--------V V V V V V V V以及各顶点之间的最短路径和最短路径长度:从V0到V1的最短路径长度为:1 ;最短路径为:V0→V1 从V0到V2的最短路径长度为:9 ;最短路径为:V0→V1→V3→V2 从V0到V3的最短路径长度为:3 ;最短路径为:V0→V1→V3 从V1到V0的最短路径长度为:11;最短路径为:V1→V3→V2→V0从V1到V2的最短路径长度为:8 ;最短路径为:V1→V3→V2 从V1到V3的最短路径长度为:2 ;最短路径为:V1→V3 从V2到V0的最短路径长度为:3 ;最短路径为:V2→V0 从V2到V1的最短路径长度为:4 ;最短路径为:V2→V0→V1 从V2到V3的最短路径长度为:6 ;最短路径为:V2→V0→V1→V3 从V3到V0的最短路径长度为:9 ;最短路径为:V3→V2→V0 从V3到V1的最短路径长度为:10;最短路径为:V3→V2→V0→V1 从V3到V2的最短路径长度为:6 ;最短路径为:V3→V2 参考程序: #include #define INFINITY 100 #define Max 10int a[Max][Max],P[Max][Max]; main() {void Print_Flod(int d);int i,j,k,D=4;printf("请输⼊成本邻接矩阵:\n");for(i=0;ifor(j=0;j{scanf("%d",&a[i][j]);}for(i=0;ifor(j=0;j{if(a[i][j]>0&& a[i][j]elseP[i][j]=-1;}for(k=0;kfor(i=0;ifor(j=0;jif (a[i][k]+a[k][j]{a[i][j]=a[i][k]+a[k][j];P[i][j]=k;}Print_Flod(D);}void Print_Flod(int d){void dist(int first,int end);int i,j;for(i=0;ifor(j=0;jif(i!=j){ printf("from V%d to V%d: ",i,j); dist(i,j);printf("V%d",j);printf(" (The length is: %d)\n",a[i][j]); }}void dist(int first,int end){ int x;x=P[first][end];if(x!=first){ dist(first,x); dist(x,end); }else printf("V%d->",x);}输出结果:。

最短路径实验报告

最短路径实验报告

最短路径实验报告最短路径实验报告引言:最短路径算法是计算机科学中的一个经典问题,它在许多领域中都有广泛的应用,如交通规划、电路设计、网络通信等。

本实验旨在通过实践探索最短路径算法的实际应用,并对其性能进行评估。

一、问题描述:我们将研究一个城市的交通网络,其中包含多个节点和连接这些节点的道路。

每条道路都有一个权重,表示通过该道路所需的时间或距离。

我们的目标是找到两个节点之间的最短路径,即使得路径上各个道路权重之和最小的路径。

二、算法选择:为了解决这个问题,我们选择了Dijkstra算法和Floyd-Warshall算法作为比较对象。

Dijkstra算法是一种单源最短路径算法,它通过不断选择当前最短路径的节点来逐步扩展最短路径树。

Floyd-Warshall算法则是一种多源最短路径算法,它通过动态规划的方式计算任意两个节点之间的最短路径。

三、实验设计:我们首先构建了一个包含10个节点和15条道路的交通网络,每条道路的权重随机生成。

然后,我们分别使用Dijkstra算法和Floyd-Warshall算法计算两个节点之间的最短路径,并记录计算时间。

四、实验结果:经过实验,我们发现Dijkstra算法在计算单源最短路径时表现出色,但是在计算多源最短路径时效率较低。

而Floyd-Warshall算法在计算多源最短路径时表现出色,但是对于大型网络的单源最短路径计算则需要较长的时间。

五、性能评估:为了评估算法的性能,我们对不同规模的交通网络进行了测试,并记录了算法的计算时间。

实验结果显示,随着交通网络规模的增大,Dijkstra算法的计算时间呈指数级增长,而Floyd-Warshall算法的计算时间则呈多项式级增长。

因此,在处理大型网络时,Floyd-Warshall算法具有一定的优势。

六、实际应用:最短路径算法在实际应用中有着广泛的用途。

例如,在交通规划中,最短路径算法可以帮助我们找到最优的行车路线,减少交通拥堵。

运筹学最短路径问题实验报告

运筹学最短路径问题实验报告

实验报告填写说明
(实验项目名称、实验项目类型必须与实验教学大纲保持一致)
1.实验环境:
实验用的硬件、软件环境。

2.实验目的:
根据实验教学大纲,写出实验的要求和目的。

3.实验原理:
简要说明本实验项目所涉及的理论知识。

4.实验步骤:
这是实验报告极其重要的容。

对于验证性验,要写清楚操作方法,需要经过哪几个步骤来实现其操作。

对于设计性和综合性实验,还应写出设计思路和设计方法。

对于创新性实验,还应注明其创新点。

5.实验结论:
根据实验过程中得到的结果,做出结论。

6.实验总结:
本次实验的收获、体会和建议。

7.指导教师评语及成绩:
指导教师依据学生的实际报告内容,给出本次实验报告的评价和成绩。

附录1:源程序。

地理信息实验报告 最短路径

地理信息实验报告  最短路径

实验二网络分析实习报告一、实验目的网络分析是GIS空间分析的重要功能分。

有两类网络,一为道路(交通)网络,一为实体网络(比如,河流、排水管道、电力网络)。

此实验主要涉及道路网络分析,主要内容包括:●最佳路径分析,如:找出两地通达的最佳路径。

●最近服务设施分析,如:引导最近的救护车到事故地点。

●服务区域分析,如:确定公共设施(医院)的服务区域。

通过对本实习的学习,应达到以下几个目的:(1)加深对网络分析基本原理、方法的认识;(2)熟练掌握ARCGIS下进行道路网络分析的技术方法。

(3)结合实际、掌握利用网络分析方法解决地学空间分析问题的能力。

二、实验准备软件准备:ArcMap,要求有网络分析扩展模块的许可授权数据准备:Shape文件创建网络数据集(高速公路:Highways, 主要街道:Major Streets, 公园:Parks,湖泊:Lakes,街道:Streets)Geodatabase网络数据集:NetworkAnalysis.mdb:包含:街道图层:Streets仓库图层:Warehouses商店图层:Stores在ArcMap中加载启用NetWorkAnylyst网络分析模块:执行菜单命令[工具Tools]>>[Extensions], 在[Extensions]对话框中点击[NetworkAnalyst] 启用网络分析模块,即装入Network Analyst空间分析扩展模块。

道路网络分析步骤1. 创建分析图层2. 添加网络位置3. 设置分析选项4. 执行分析过程显示分析结果三、实验内容及步骤(一) 最佳路径分析根据给定的停靠点,查找最佳路径(最省时的线路)1.1 数据准备1.2 创建路径分析图层1.3 添加停靠点1.4 设置分析选项1.5 运行最佳路径分析得到分析结果1.6 设置路障(barrier)(二) 最近服务设施分析(查找最近的消防队)在这个实验中,当某个位置发生火灾时将找到距事故最近的四个消防队,并且可以进一步找到能够最快到达事故地点的路线.2.1 数据准备2.2 创建“最近服务设施分析图层”2.3 添加“服务设施”图层2.4 设定火灾事故发生地点2.5 设置分析选项四.实验感悟实验可以提高我的实践能力,我觉得我应该加强实验。

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

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

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

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

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

最短路径实验报告

最短路径实验报告

云南财经大学信息学院学生综合性与设计性实验报告(2013—2014 学年第 2 学期)一、实验内容与目的1.内容查看“最短路径.swf”,选择熟悉的程序设计语言定义有向图,根据动画演示求取从有向图任一结点到其他结点的最短路径。

2.实验目的了解最短路径的概论,掌握求最短路径的方法。

二、实验原理或技术路线(可使用流程图描述)实验原理:(李燕妮负责设计,周丽琼负责编程)图是由结点的有穷集合V和边的集合E组成,求最短路径用迪杰斯特拉算法:1)适用条件&范围:a) 单源最短路径(从源点s到其它所有顶点v);b) 有向图&无向图(无向图可以看作(u,v),(v,u)同属于边集E的有向图)c) 所有边权非负(任取(i,j)∈E都有Wij≥0);2)算法描述:a)初始化:dis[v]=maxint(v∈V,v≠s); dis[s]=0; pre[s]=s; S={s};b)For i:=1 to n1.取V-S中的一顶点u使得dis[u]=min{dis[v]|v∈V-S}2.S=S+{u}3.For V-S中每个顶点v do Relax(u,v,Wu,v)c)算法结束:dis[i]为s到i的最短距离;pre[i]为i的前驱节点三、实验环境条件(使用的软件环境)Microsoft Visual C++6.0四、实验方法、步骤(列出程序代码或操作过程)/*本程序的功能是求图中任意两点间的最短路径*/#include<stdio.h>#include<stdlib.h>#include<conio.h>#include<string.h>#define ING 9999typedef struct ArcCell{int adj;/*顶点关系类型,用1表示相邻,0表示不相邻*/}ArcCell,**AdjMatrix;/*邻接矩阵*/typedef struct type{char data[3];/*顶点值*/}VertexType;typedef struct{VertexType *vexs; /*顶点向量*/AdjMatrix arcs; /*邻接矩阵*/int vexnum,arcnum; /*图的顶点数和边数*/}MGraph;/*初始图*/void InitGraph(MGraph *G){int i,nu,mu;printf("\n输入顶点的个数和(边)弧的个数:");scanf("%d %d",&nu,&mu);G->arcs=(ArcCell **)malloc(nu*sizeof(ArcCell *));for(i=0;i<nu;i++)/*分配邻接矩阵空间*/G->arcs[i]=(ArcCell *)malloc(nu*sizeof(ArcCell));G->vexs=(VertexType *)malloc(nu*sizeof(VertexType)); /*分配顶点空间*/ G->vexnum=nu;G->arcnum=mu; /*图的顶点数和边数*/}void InsertGraph(MGraph *G,int i,VertexType e){if(i<0||i>G->vexnum) return;strcpy(G->vexs[i].data,e.data);}/*确定v1在图顶点中的位置*/int Locate(MGraph G,VertexType v1){int i;for(i=0;i<G.vexnum;i++)if(strcmp(v1.data,G.vexs[i].data)==0) return i;return -1;}/*采用数组(邻接矩阵)和邻接表表示无向图*/void CreateUND(MGraph *G){int i,j,k,*p,w;VertexType v1,v2;p=(int *)malloc(G->vexnum*sizeof(int));for(i=0;i<10;i++) p[i]=0;for(i=0;i<G->vexnum;++i) /*初始邻接表*/{for(j=0;j<G->vexnum;++j)G->arcs[i][j].adj=ING;}for(k=0;k<G->arcnum;++k){printf("\n输入第%d 条(边)弧相对的两个顶点值:\n",k+1);scanf("%s %s",v1.data,v2.data);/*输入相邻的两个点值*/printf("输入它们的权值: ");scanf("%d",&w);i=Locate(*G,v1);j=Locate(*G,v2); /*用i 和j来确定它们的位置*/G->arcs[i][j].adj=w;}}/*输出邻接矩阵*/void Pint(MGraph G){int i,j;for(i=0;i<G.vexnum;i++){for(j=0;j<G.vexnum;j++){if(G.arcs[i][j].adj!=ING)printf("\t%d",G.arcs[i][j].adj);else{if(i==j)printf("\t0");else printf("\t∞");}}printf("\n");}}/*对顶点V0到其余顶点v的最短路径p[v]及其带权长度D[v]若p[v][w]为1,则w是从V0到W当前求得最短路径上的顶点, final[v]为1,当且仅当v属于S,即已经求得从v0到v的最短路*/void ShortestPath(MGraph G,int v0,int **p,int *D){int v,u,i,w,min;int *final;final=(int *)malloc(G.vexnum*sizeof(int));/*分配空间*/for(v=0;v<G.vexnum;++v){final[v]=0;D[v]=G.arcs[v0][v].adj;/*初始化*/for(w=0;w<G.vexnum;++w) p[v][w]=0;/*设空路径*/if(D[v]<ING){p[v][v0]=1;p[v][v]=1;}/*v到v0有路径*/}D[v0]=0;final[v0]=1;/*初始化,V0顶点属于S集*/for(i=1;i<G.vexnum;i++){/*其余G.vexnum-1个顶点*/min=ING;for(w=0;w<G.vexnum;++w) /*求出矩阵这一行的最小值*/ if(!final[w]) /*W顶点属于V-S中*/if(D[w]<min){v=w;min=D[w];}final[v]=1;/*离V0顶点最近的V加入S集*/for(w=0;w<G.vexnum;++w) /*更新当前最短路径及距离*/ if(!final[w]&&(min+G.arcs[v][w].adj<D[w])){ /*不是最小的,修改D[w],P[w]*/D[w]=min+G.arcs[v][w].adj;for(u=0;u<G.vexnum;u++)p[w][u]=p[v][u];p[w][w]=1;}}free(final);}void main(){MGraph G;VertexType e;int i,j;int **p;int *D;InitGraph(&G);p=(int **)malloc(G.vexnum*sizeof(int *));for(i=0;i<G.vexnum;i++)p[i]=(int *)malloc(G.vexnum*sizeof(int));D=(int *)malloc(G.vexnum*sizeof(int));printf("顶点值:\n");for(i=0;i<G.vexnum;++i)/*给图顶点向量付值*/{scanf("%s",e.data);InsertGraph(&G,i,e);}CreateUND(&G);/*构造图结构*/printf("邻接矩阵为:\n");Pint(G);for(i=0;i<G.vexnum;i++) /*输出邻接矩阵*/{ShortestPath(G,i,p,D); /*调用最短函数*/for(j=0;j<G.vexnum;j++)if(i!=j) printf(" %s 到%s 的最短路径为%d \n",G.vexs[i].data,G.vexs[j].data,D[j]);printf("\n\n");}getch();}五、实验过程原始记录( 测试数据、图表)请给出各个操作步骤的截图和说明,要求有对时间复杂度和空间复杂度的说明。

实验报告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;}四、实验结果五、实验总结本次实验主要是学习掌握图的存储结构,学会编写求最短路径的算法。

最短路径实验报告

最短路径实验报告
{
D[w] = min+mgraph.arcs[v][w].adj; //更新D[w]
for(j = 0;j<mgraph.vexnum;j++)
//修改P[w],v0到w经过的顶点包括v0到v经过的顶点再加上顶点w
{
P[w][j] = P[v][j];
}
P[w][w] = true;
}
}
}
}
3、运行与测试
for(w = 0;w<mgraph.vexnum;w++)
{
D[v][w] = mgraph.arcs[v][w].adj;//顶点v到顶点w的直接距离
for(u = 0;u<mgraph.vexnum;u++)
{
P[v][w][u] = false;//路径矩阵初值
}
if(D[v][w]<infinity)
//根据新并入的顶点,更新不在S集的顶点到v0的距离和路径数组
{
if(!final[w]&&min<infinity&&mgraph.arcs[v][w].adj<infinity&&
(min+mgraph.arcs[v][w].adj<D[w]))
// w不属于S集且v0→v→w的距离<目前v0→w的距离
程序运行如图所示。
Step1:运行程序,屏幕显示菜单。
Step2:运行功能选择。
Case1:输入“1”,选择菜单项1,进入图的创建操作。
1.1根据屏幕提示,创建有向网。
1.2屏幕显示网信息。
Case2:输入“2”,选择菜单项2,进入求源点到其他各点的距离操作。

实验11 最短路径问题实验报告

实验11 最短路径问题实验报告
问题具体的形式包括:
确定起点的最短路径问题,即已知起始结点,求最短路径的问题。适合使用Dijkstra算法。
确定终点的最短路径问题,与确定起点的问题相反,该问题是已知终结结点,求最短路径的问题。在无向图中该问题与确定起点的问题完全等同,在有向图中该问题等同于把所有路径方向反转的确定起点的问题。
确定起点终点的最短路径问题,即已知起点和终点,求两结点之间的最短路径。
return i;
return i;
}
int next(Docu*D , int v , int w)
{
int i;
for(i=w+1 ; i<D->n ; i++)
(D->edge[v][i])!=-1)
return i;
return i;
}
int weight(Docu*D,int v,int w)
for(j=0 ; j<D->n ; j++)
fin>>D->edge[i][j]; //从文件中读取边权值
int start , end;
cout<<"起点:"<<endl;
cin>>start;
cout<<"终点:"<<endl;
cin>>end;
int *B;
B=(int *)malloc(D->n*sizeof(int));
v=i;
return v;
}
void Dijkstra(Docu*D , int *B , int s)
{
int i,v,w;

最短路径_Dijkstra算法__实验报告

最短路径_Dijkstra算法__实验报告

最短路径_Dijkstra算法__实验报告实验六:编程实现Dijkstra 算法求最短路问题.1.需求分析:首先让用户输入一个带权的有向图,输入时可通过一对一对输入存在弧的两个弧头与弧尾顶点以及弧上的权值从而输入整个有向图。

用户输入一对对弧后,我们可以采用数组的形式来进行存储每个顶点之间的权值,最后由用户输入该有向图的源点(即每个最短路径的起点),要求源点必须为刚才输入的各顶点中的某一个,如果用户输入错误,程序要给出错误信息提示并退出程序。

然后,我们可以设计一个Graph这样的类,将对关系的各种操作放入其中,然后我们在主函数中调运这个类就可以实现最短路问题的求解了。

2.概要设计:①.构造一个新的类Graph:class Graph{private: int arcs[MAX][MAX],Path[MAX][MAX],D[MAX];int arcnum,vexnum,weight,v0;Type a,b,vexs[MAX];public:void Creat_Graph();void Show_ShortestPath();void ShortestPath_DIJ();};②.结构化调用类中方法的主函数:int main(){Graph G;G.Creat_Graph();G.ShortestPath_DIJ();G.Show_ShortestPath();return 0;}3.代码实现:#include#define MAX 100#define INFINITY INT_MAXenum BOOL{FALSE,TRUE};using namespace std;templateclass Graph{private: int arcs[MAX][MAX],Path[MAX][MAX],D[MAX]; int arcnum,vexnum,weight,v0;Type a,b,vexs[MAX];public:void Creat_Graph();void Show_ShortestPath();void ShortestPath_DIJ();};templatevoid Graph::Creat_Graph(){int i,j,x,y;cout<<"请输入你要处理的有向图中包含弧的个数:"; cin>>arcnum;vexnum=0;for(i=1;i<=MAX;i++)for(j=1;j<=MAX;j++)arcs[i][j]=INT_MAX;for(i=1;i<=arcnum;i++){cout<<"请依次输入第"<<i<<"条弧的弧头与弧尾的顶点以及该弧上所附带的权值:"<<endl;< p="">cin>>a>>b>>weight;x=0; y=0;for(j=1;j<=vexnum;j++){if(vexs[j]==a){x=j; continue;}else if(vexs[j]==b){y=j; continue;}}if(x==0){vexs[++vexnum]=a; x=vexnum;}if(y==0){vexs[++vexnum]=b; y=vexnum;}arcs[x][y]=weight;}cout<<"请输入该有向图的源点(即各最短路径的起始顶点):";cin>>a;for(i=1;i<=vexnum;i++){if(vexs[i]==a){v0=i; break;}}}templatevoid Graph:: Show_ShortestPath(){int i,j,k;for(i=1;i<=vexnum;i++){if(i==v0) continue;if(D[i]!=INT_MAX){cout<<"从源点"<<vexs[v0]<<"到"<<vexs[i]<<"的最短路径为:"<<endl;< p="">for(k=1;k<=Path[i][0];k++){if(k!=1)cout<<"-->";for(j=1;j<=vexnum;j++)if(Path[i][j]==k)cout<<vexs[j];< p="">}cout<<" "<<"其最短的路径长度为:"<<d[i]<<endl;< p="">}else{cout<<"无法从源点"<<vexs[v0]<<"到达顶点"<<vexs[i]<<"."<<endl;< p="">}}cout<<endl;< p="">}templatevoid Graph::ShortestPath_DIJ(){int v,w,final[MAX],min,i,j;for(v=1;v<=vexnum;v++){final[v]=FALSE; D[v]=arcs[v0][v]; Path[v][0]=0;for(w=0;w<=vexnum;w++)Path[v][w]=FALSE;if(D[v]<int_max)< p="">{ Path[v][v0]=++Path[v][0]; Path[v][v]=++Path[v][0]; }}D[v0]=0; final[v0]=TRUE;for(i=1;i<=vexnum;i++){if(i==v0) continue;min=INT_MAX;for(w=1;w<=vexnum;w++)if(!final[w])if(D[w]<="">final[v]=TRUE;for(w=1;w<=vexnum;w++)if(!final[w]&&(min+arcs[v][w]<d[w])&&min<int_max&&arcs [v][w]<int_max)< p="">{D[w]=min+arcs[v][w];for(j=0;j<=vexnum;j++)Path[w][j]=Path[v][j];Path[w][w]=++Path[w][0];}}}int main(){Graph G;G.Creat_Graph();G.ShortestPath_DIJ();G.Show_ShortestPath();return 0;}4.调试分析:起先在主函数中调用类Graph时将类型参数T赋值为int从而导致用户输入的关系集合R中的元素必须为整数。

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

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

《数据结构课程设计》最短路径问题实验报告目录一、概述 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 的信息)。

最短路径问题实验报告

最短路径问题实验报告

徐州工程学院管理学院实验报告实验课程名称:最短路径问题实验地点:南主楼七楼机房经济管理实验中心 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 --=。

Dijkstra最短路径算法实习报告

Dijkstra最短路径算法实习报告

Dijkstra最短路径算法实习报告1.引言交通诱导系统的一个核心技术是最优路径的选择技术。

根据交通网络模型中各顶点和顶点之间的长度、时间或费用等属性权值,通过Dijkstra最短路径算法,解决有向图即交通网络模型中源点到其他顶点的最短路径问题。

2.建立交通道路网络模型交通道路网是路径诱导的基础和对象,首先需要建立交通道路网络模型。

交通道路网中的路段具有属性,且同一路段的两个方向其属性一般不完全相同,有向图能够很好地表达实际的交通网络,便于处理同路段两个方向的不同属性和单行线、交叉口转向限制等特殊交通属性。

综上,采用带权有向图来表达交通道路网。

其中,道路的终点和十字路口通常定义为一个顶点,两个顶点之间的道路定义为一条弧,每条弧根据其距离、途中所需时间或交通费用等定义为路段权值。

在有向图上,一条以i为起点,以j为终点的路径是一些顶点的序列,其中前一条弧的终点是后一条弧的起点,一条路线用一个有序的点集描述,而一条路线的长度、时间或者费用等属性为这条路径上的所有弧的权值之和。

这样便建立好了交通道路网络的模型。

3.最短路径算法迪杰斯特拉(Dijkstra)算法是经典路径诱导规划算法,Dijkstra算法是一个按路径长度递增的次序产生最短路径的算法,算法比较简单,容易实现,但计算量较大。

3.1算法分析:首先引进辅助向量D,它的每个分量D[i]表示当前所找到的从始点v0到每个终点vi的最短路径的长度。

为D[i]赋初值,若从v0到vi有弧,则D[i]为弧上的权值,否则置D[i]为∞。

则长度为D[j]=Min{D[i]|vi∈v}的路径就是从v0出发的长度最短的一条最短路径,此路径为v0—vj。

设下一条长度次短的路径的终点是vk,则这条路径或者是v0—vk,或者是v0—vj—vk。

它的长度是v0到vk弧上的权值或D[j]和vj到vk弧上权值之和。

3.2算法正确性证明:设s为为已切得最短路径的终点的集合,则有结论:下一条最短路径(设其终点为vx)或者是v0—vx,或者是中间只经过s中的顶点而最后到达顶点x的路径。

实验二:空间分析实验—最短路径

实验二:空间分析实验—最短路径

实验四:空间分析实验—最短路径一、背景在现实中,最短路径的求取问题是可以拓展为许多方面的最高效率问题,最短路径不仅指一般意义上的距离最短,还可以是时间最短、费用最少、线路利用率最高等标准。

二、目的学会用ArcGIS 9进行各种类型的最短路径分析,理解网络分析原理。

三、数据GeoDatabase地理数据库:City.mdb。

数据库中包含一个数据集:City,其中含有城市交通网net、商业中心及家庭住址place、网络节点city_Net_Junctions等要素。

四、要求根据不同的要求,获得到达指定目的地的最佳路径,并给出路径的长度;找出距景点最近的某设施的路径。

在网络中指定一个商业中心,分别求出在不同距离、时间的限制下从家到商业中心的最佳路径。

给定访问顺序,按要求找出从家出发,逐个经过访问点,最终到达目的地的最佳路径。

研究阻强的设置对最佳路径选择的影响。

五、操作步骤1.启动ArcMap。

创建新地图文档,点击菜单File—>Add Data,打开D:\GIS_Data\Ex2\city.mdb文件,加载数据。

2.对点状要素place符号化:以HOME字段,1值为家,0值为商业中心。

图1图2图33.加入网络分析工具条图44.无权重最佳路径的生成(1)在网络分析工具条上,选择旗标工具,将旗标放在“家”和想要去的“商业中心”点上。

图5(2)选择Analysis Options命令,打开Analysis Options对话框,确认Weights和Weight Filter标签项全部是None,这种情况下进行的最短路径分析是完全按照这个网络自身的长短来确定。

图6(3)在Track Task文本框中选择Find path。

单击solve按钮。

显示出最短路径,这条路径的总成本显示在状态栏中。

注:这里的“18”指的是从起点到目的地总共经过了17个网络节点,如果把两个网络节点当作一个街区的话,也就是指中间经过了17个街区。

运筹学最短路径实验

运筹学最短路径实验
3. (1) 为刚得到P标号的点,考察边
(2)比较所有T标号, , 最小,给 以P标号,令 ,记录路径
4. (1) 为刚得到P标号的点,考察
(2)比较所有T标号, , 最小,给 以P标号,令
,记录路径
5. (1) 为刚得到P标号的点,考察
(2)比较所有T标号, , 最小,给 以P标号,令 ,记录路径
实验项目:最短路径问题
实验学时: 4
实验日期:2012年11月30日
实验要求:案例 模型 分析
实验内容:用最短路径模型解决具体问题
前言
运输是物流过程的主要职能之一,也是物流过程各项业务的中心活动。物流过程中的其它各项活动,如包装、装卸搬运、物流信息等,都是围绕着运输而进行的。可以说,在科学技术不断进步、生产的社会化和专业化程度不断提高的今天,一切物质产品的生产和消费都离不开运输。物流合理化,在很大程度上取决于运输合理化。所以,在物流过程的各项业务活动中,运输是关键,起着举足轻重的作用。而有效的缩减路径可以使得运输费用降低。本文运用Dijkstra算法求出最短路径,以最大限度地节约运输费用降低物流成本,Dijkstra算法用于求解最短路径问题最常用的方法之一。
案例分析
下图所示是某地区交通运输的示意图,试问从 出发,经哪条路线达到 才能使总行程最短?使用Dijkstra求解。
5 9
4 4 7 5 4
6 4 5 1
7 6
步骤:
1.首先给 以P标号, ,给其余所有的点以T标号,
2.(1)考察点 ,边
(2)比较所有T标号 , 最小,所以给 以P标号,令 ,记录路径
实验总结
科学合理的运输路线对物流的成本的大小影响很大。Dijkstra算法就是通过一种方法,使运输路线最短,运费最少,尽可能的降低物流成本,提高产品的竞争力,Dijkstra,根据距 从近到远的顺序,依次求得 到 各顶点的最短路径和距离,直至 ,算法结束。根据记录的最后路径 逆推至 , , ,总结出路径为 ,所以最短距离为15.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、图的定义和术语
图是一种数据结构。
ADT Graph{
数据对象V:V是据有相同特性的数据元素的集合,称为顶点集。
数据关系R:
R={VR}
VR={<v,w>|v,w∈V且P(v,w), <v,w>表示从v到w的弧,P(v,w)定义了弧<v,w>的意义或信息}
图中的数据元素通常称为顶点,V是顶点的有穷非空集合;VR是两个顶点之间的关系的集合,若顶点间是以有向的弧连接的,则该图称为有向图,若是以无向的边连接的则称为无向图。弧或边有权值的称为网,无权值的称为图。
电子科技大学计算机学院
标准实验报告
(实验)课程名称最短路径规划
电子科技大学教务处制表
实验报告
学生姓名:李彦博学号:2902107035指导教师:陈昆
一、实验项目名称:最短路径规划
二、实验学时:32学时
三、实验原理:Dijkstra算法思想。
四、实验目的:实现最短路径的寻找。
五、实验内容:
1、图的基本概念及实现。
分析:实验准确找到了从V1出发的到各点的最短路径及权值,实现了最短路径的规划。
九、实验结论:
通过Dijkstra算法思想快速准确的实现了最短路径的规划。
十、总结及心得体会:
通过最短路径规划实验课的学习,进一步巩固了我的c语言知识,而且了解了Dijkstra算法思想,掌握了怎样实现最短路径规划及实现最短路径规划的意义。
final[v]=TRUE;a[i-1]=v+1; //离V0顶点最近的V加入S集
for(w=0;w<g.vexnum;++w) //更新当前最短路径及距离
if(!final[w]&&(min+g.arcs[v][w])<d[w]){//修改D[w]和p[w],wn属于V-S
d[w]=min+g.arcs[v][w];
printf("经过的点为: V1 ");
{for(j=0;j<5;j++)
for(k=0;k<6;k++)
if(p[i][k]==TRUE && a[j]==(k+1)) printf("V%d\t",a[j]);
}
printf("\n");
};
}
八、实验数据及结果分析:
数据:V1到各点的最短路径及权值分别为:V1→V2,权值:5;V1→V2→V3,权值:9;V1→V4,权值:7;V1→V4→V6→V5,权值:14;V1→V4→V6,权值:13.
二、算法描述
1)arcs[i,j]表示弧<vi,vj>上的权值。若<vi,vj>不存在,则置arcs[i,j]为∞(在本程序中为MAXCOST)。S为已找到从v出发的最短路径的终点的集合,初始状态为空集。那么,从v出发到图上其余各顶点vi可能达到的最短路径长度的初值为D[i]=arcs[Locate Vex(G,v),i] vi∈V
for(k=0;k<6;k++)p[w][k]=p[v][k];
p[w][w]=TRUE;
}
}
printf("\n");
printf("\n对应最短路径为:\n");
printf("\n"); //美化格式
for(i=1;i<6;i++)
{ printf("从V1点到V%d点的最短路径长为:",i+1);printf("%d\t",d[i]);
{
k=i+1;
printf("V%d",k);
for(j=0;j<6;j++)
{
if(g.arcs[i][j]>99)
printf("max");
else
printf("%d",g.arcs[i][j]);
}
printf("\n");
}
//用Dijkstra算法求有向网的v0点到其余各点v的最短路径P[v]及其带权长度D[v].
报告评分:
指导教师签字:
几点注意事项:
1.封面统一到教务处购买;
2.实验报告的各项标题和源程序需要打印,其他内容必须手写(不能用圆珠笔);
3.除最后一项外,其余各项必须填写。
那么,下一条长度次短的最短路径是哪一条呢?假设该次短路径的终点是vk,则可想而知,这条路径或者是(v,vk),或者是(v,vj,vk)。它的长度或者是从v到vk的弧上的权值,或者是D[j]和从vj到vk的弧上的权值之和。
一般情况下,假设S为已求得最短路径的终点的集合,则可证明:下一条最短路径(设其终点为X)或者是弧(v,x),或者是中间只经过S中的顶点而最后到达顶点X的路径。因此,下一条长度次短的最短路径的长度必是D[j]=Min{D[i] | vi∈V-S}其中,D[i]或者是弧(v,vi)上的权值,或者是D[k](vk∈S)和弧(vk,vi)上的权值之和。
Int vexnum,arcnum; //图的当前顶点数和弧数
GraphKind kind; //图的种类标志
}MGraph;
1.练习:构造一个有向网。
2、Dijkstra算法思想及实现。
一、算法思想
首先,引进一个辅助向量D,它的每个分量D[i]表示当前所找到的从始点v到每个终点vi的最短路径的长度。如D[3]=2表示从始点v到终点3的路径相对最小长度为2。这里强调相对就是说在算法过程中D[i]的值是在不断逼近最终结果但在过程中不一定就等于最短路径长度。它的初始状态为:若从v到vi有弧,则D[i]为弧上的权值;否则置D[i]为∞。显然,长度为D[j]=Min{D[i] | vi∈V}的路径就是从v出发的长度最短的一条最短路径。此路径为(v,vj)。
七、实验步骤:
程序:
#include<stdio.h>
#define m 100
#define TRUE 1
#define FALSE 0
typedef struct Cel{
int arcs[6][6]; //邻接矩阵
int vexnum;
};
void main()
{
int d[6],p[6][6],v,w,final[6],i,j,k,min,a[5]={1,1,1,1,1},n,z,x,c,b;
//对带权图,则为权值类型。
InfoType *info; //弧相关信息的指针
}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
Typedef struct{
VertexType vexs[MAX_VERTEX_NUM]; //顶点向量
AdjMatrix EX_NUM 20 //最大顶点个数
Typedef enum{DG,DN,UDG,UDN} GraphKind; //有向图,有向网,无向图,无向网
Typedef struct ArcCell{
VRType adj; //顶点关系类型,对无权图,有1或0表示是否相邻;
2)选择vj,使得D[j]=Min{D[i] | vi∈V-S}
3)修改从v出发到集合V-S上任一顶点vk可达的最短路径长度。如果D[j]+arcs[j,k]<D[k]则修改D[k]为D[k]=D[j]+arcs[j,k]。
4)重复2)和3),直到找到目标顶点或遍历所有顶点为止。
六、实验器材(设备、元器件):电脑
//若P[v][w]为TRUE,则w是从v0到v当前求得最短路径上的顶点。其中w为经过的顶点。
//final[v]为TRUE当且仅当v在s中,即已经求得从v0到v的最短路径。
//初始化
for (v=0;v<g.vexnum;++v){
final[v]=FALSE; d[v]=g.arcs[0][v];
for(i=1;i<g.vexnum;++i)
{ //其余g.vexnum-1个顶点
min=m; //当前所知离V0顶点的最近距离
for(w=0;w<g.vexnum;++w)
if(!final[w]) //w顶点在V-S中
if(d[w]<min){v=w;min=d[w];} //W顶点离V0更近
Cel g={ m,5,m,7,m,m,
m,m,4,m,m,m,
8,m,m,m,m,9,
m,m,5,m,m,6,
m,m,m,5,m,m,
3,m,m,m,1,m,
6};
printf("对应的矩阵为:\n");
printf("\n");
printf("V1V2V3V4V5V6\n"); //美化格式
for(i=0;i<6;i++)
二、图的存储结构
邻接表、邻接多重表、十字链表和数组。这里我们只介绍数组表示法。
图的数组表示法:
用两个数组分别存储数据元素(顶点)的信息和数据元素之间的关系(边或弧)的信息。其形式描述如下:
//---------图的数组(邻接矩阵)存储表示----------
#define INFINITY INT_MAX //最大值
for (w=0;w<g.vexnum;++w) p[v][w]=FALSE;//设空路径
if(d[v]<m){p[v][0]=TRUE; p[v][v]=TRUE;}
}
d[0]=0; final[0]=TRUE; //初始化,V0顶点属于S
相关文档
最新文档