最短路径规划实验报告

合集下载

最短路径的实验报告

最短路径的实验报告

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

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

实验设计:本次实验使用了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();}五、实验过程原始记录( 测试数据、图表)请给出各个操作步骤的截图和说明,要求有对时间复杂度和空间复杂度的说明。

  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
相关文档
最新文档