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

合集下载

的最短路径算法研究Dijkstra和FloydWarshall算法

的最短路径算法研究Dijkstra和FloydWarshall算法

的最短路径算法研究Dijkstra和FloydWarshall算法最短路径算法研究——Dijkstra和FloydWarshall算法最短路径算法,作为图论中的一项重要内容,旨在寻找起点到终点之间最短路径的方法。

其中,Dijkstra算法和FloydWarshall算法是两种被广泛应用的最短路径算法。

本文将对这两种算法进行分析和比较,探讨它们的原理、特点及优缺点。

一、Dijkstra算法Dijkstra算法是由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年提出的。

该算法被广泛应用于计算机网络、交通规划以及地理导航等领域。

Dijkstra算法的原理是通过维护一个距离表来记录起点到图中各个节点的最短距离。

算法的步骤如下:1. 初始化距离表,将起点到各个节点的距离设为无穷大。

2. 将起点设为当前节点,并将其最短距离设为0。

3. 遍历当前节点的邻居节点,更新距离表中的最短距离。

4. 从未访问过的节点中选择最小距离的节点,将其设为当前节点,并更新距离表。

5. 重复步骤3和步骤4,直到所有节点都被访问过。

Dijkstra算法的特点是每次选择当前节点时,会找到距离起点最近的节点,并更新其邻居节点的最短距离。

该算法的时间复杂度为O(V^2),其中V为节点数。

然而,Dijkstra算法仅适用于没有负权边的有向图。

二、FloydWarshall算法FloydWarshall算法是由罗伯特·弗洛伊德和斯蒂芬·沃沃舍尔在1962年提出的。

该算法可用于计算一个加权图中所有节点对之间的最短距离。

FloydWarshall算法的原理是通过动态规划的方式,构建一个二维矩阵用于存储任意两点之间的最短距离。

算法的步骤如下:1. 初始化矩阵,将图中各个节点对之间的距离设置为无穷大。

2. 根据图中已有的边,更新矩阵中的距离值。

3. 遍历矩阵中的每个元素,尝试通过第三个节点使得两点之间的距离更短。

4. 重复步骤2和步骤3,直到矩阵中的每个元素都被更新过。

最短路径的实验报告

最短路径的实验报告

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

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

实验设计:本次实验使用了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中。

数学建模实验报告-第十一章-最短路问题

数学建模实验报告-第十一章-最短路问题

实验名称:第十一章最短路问题一、实验内容与要求掌握Dijkstra算法和Floyd算法,并运用这两种算法求一些最短路径的问题.二、实验软件MATLAB7.0三、实验内容1、在一个城市交通系统中取出一段如图所示,其入口为顶点v1,出口为顶点v8,每条弧段旁的数字表示通过该路段所需时间,每次转弯需要附加时间为3,求v1到v8的最短时间路径.63V4 2 V7 4 V8程序:function y=bijiaodaxiao(f1,f2,f3,f4)v12=1;v23=3;v24=2;v35=1;v47=2;v57=2;v56=6;v68=3;v78=4;turn=3;f1=v12+v23+v35+v56+turn+v68;f2=v12+v23+v35+turn+v57+turn+v78;f3=v12+turn+v24+turn+v47+v78;f4=v12+turn+v24+v47+turn+v57+turn+v56+turn+v68;min=f1;if f2<minmin=f2;endif f3<minmin=f3;endif f4〈minmin=f4;endminf1f2f3f4实验结果:v1到v8的最短时间路径为15,路径为1—2-4-7-8.2、求如图所示中每一结点到其他结点的最短路。

V110 V3V59 V6function[D,R]=floyd(a)n=size(a,1);D=afor i=1:nfor j=1:nR(i,j)=j;endendRfor k=1:nfor i=1:nfor j=1:nif D(i,k)+D(k,j)<D(i,j)D(i,j)=D(i,k)+D(k,j);R(i,j)=R(i,k);endendendkDRend程序:>〉a=[0 3 10 inf inf inf inf inf;3 0 inf 5 inf inf inf inf;10 inf 0 6 inf inf inf inf;inf 5 6 0 4 inf 10 inf ;inf inf inf 4 0 9 5 inf ;inf inf inf inf 9 0 3 4;inf inf inf 10 5 3 0 6;inf inf inf inf inf 4 6 0;];[D,R]=floyd(a)实验结果:D =0 3 10 Inf Inf Inf Inf Inf3 0 Inf 5 Inf Inf Inf Inf10 Inf 0 6 Inf Inf Inf InfInf 5 6 0 4 Inf 10 InfInf Inf Inf 4 0 9 5 InfInf Inf Inf Inf 9 0 3 4Inf Inf Inf 10 5 3 0 6Inf Inf Inf Inf Inf 4 6 0R =1 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 8k =1D =0 3 10 Inf Inf Inf Inf Inf3 0 13 5 Inf Inf Inf Inf10 13 0 6 Inf Inf Inf InfInf 5 6 0 4 Inf 10 InfInf Inf Inf 4 0 9 5 InfInf Inf Inf Inf 9 0 3 4Inf Inf Inf 10 5 3 0 6Inf Inf Inf Inf Inf 4 6 0R =1 2 3 4 5 6 7 81 2 1 4 5 6 7 81 1 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 8 k =2D =0 3 10 8 Inf Inf Inf Inf3 0 13 5 Inf Inf Inf Inf10 13 0 6 Inf Inf Inf Inf8 5 6 0 4 Inf 10 InfInf Inf Inf 4 0 9 5 InfInf Inf Inf Inf 9 0 3 4Inf Inf Inf 10 5 3 0 6Inf Inf Inf Inf Inf 4 6 0R =1 2 3 2 5 6 7 81 2 1 4 5 6 7 81 1 3 4 5 6 7 82 234567 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 8 k =3D =0 3 10 8 Inf Inf Inf Inf3 0 13 5 Inf Inf Inf Inf10 13 0 6 Inf Inf Inf Inf8 5 6 0 4 Inf 10 InfInf Inf Inf 4 0 9 5 InfInf Inf Inf Inf 9 0 3 4Inf Inf Inf 10 5 3 0 6Inf Inf Inf Inf Inf 4 6 0R =1 2 3 2 5 6 7 81 2 1 4 5 6 7 81 1 3 4 5 6 7 82 234567 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 81 2 3 4 5 6 7 8k =4D =0 3 10 8 12 Inf 18 Inf3 0 11 5 9 Inf 15 Inf10 11 0 6 10 Inf 16 Inf8 5 6 0 4 Inf 10 Inf12 9 10 4 0 9 5 InfInf Inf Inf Inf 9 0 3 418 15 16 10 5 3 0 6Inf Inf Inf Inf Inf 4 6 0R =1 2 3 2 2 6 2 81 2 4 4 4 6 4 81 4 3 4 4 6 4 82 234567 84 4 4 4567 81 2 3 4 5 6 7 84 4 4 4567 81 2 3 4 5 6 7 8 k =5D =0 3 10 8 12 21 17 Inf3 0 11 5 9 18 14 Inf10 11 0 6 10 19 15 Inf8 5 6 0 4 13 9 Inf12 9 10 4 0 9 5 Inf21 18 19 13 9 0 3 417 14 15 9 5 3 0 6Inf Inf Inf Inf Inf 4 6 0R =1 2 3 2 2 2 2 81 2 4 4 4 4 4 81 4 3 4 4 4 4 82 2345 5 5 84 4 4 4567 85 5 5 5 567 85 5 5 5 567 81 2 3 4 5 6 7 8 k =6D =0 3 10 8 12 21 17 253 0 11 5 9 18 14 2210 11 0 6 10 19 15 238 5 6 0 4 13 9 1712 9 10 4 0 9 5 1321 18 19 13 9 0 3 417 14 15 9 5 3 0 625 22 23 17 13 4 6 0 R =1 2 3 2 2 2 2 21 2 4 4 4 4 4 41 4 3 4 4 4 4 42 2345 5 5 54 4 4 4567 65 5 5 5 567 85 5 5 5 567 86 6 6 6 6 678 k =7D =0 3 10 8 12 20 17 233 0 11 5 9 17 14 2010 11 0 6 10 18 15 218 5 6 0 4 12 9 1512 9 10 4 0 8 5 1120 17 18 12 8 0 3 417 14 15 9 5 3 0 623 20 21 15 11 4 6 0 R =1 2 3 2 2 2 2 21 2 4 4 4 4 4 41 4 3 4 4 4 4 42 2345 5 5 54 4 4 45 7 7 77 7 7 7 7 6 7 85 5 5 5 567 87 7 7 7 7 6 7 8 k =8D =0 3 10 8 12 20 17 233 0 11 5 9 17 14 2010 11 0 6 10 18 15 218 5 6 0 4 12 9 1512 9 10 4 0 8 5 1120 17 18 12 8 0 3 417 14 15 9 5 3 0 623 20 21 15 11 4 6 0R =1 2 3 2 2 2 2 21 2 4 4 4 4 4 41 4 3 4 4 4 4 42 2345 5 5 54 4 4 45 7 7 77 7 7 7 7 6 7 85 5 5 5 567 87 7 7 7 7 6 7 8D =0 3 10 8 12 20 17 233 0 11 5 9 17 14 2010 11 0 6 10 18 15 218 5 6 0 4 12 9 1512 9 10 4 0 8 5 1120 17 18 12 8 0 3 417 14 15 9 5 3 0 623 20 21 15 11 4 6 0 R =1 2 3 2 2 2 2 21 2 4 4 4 4 4 41 4 3 4 4 4 4 42 2345 5 5 54 4 4 45 7 7 77 7 7 7 7 6 7 85 5 5 5 567 87 7 7 7 7 6 7 8四、实验体会。

迪杰斯特拉求最短路径算法

迪杰斯特拉求最短路径算法

通过使用迪杰斯特拉算法,我们可以找到这些最短 路径,从而帮助决策者做出更好的决策
在这些应用中,我们需要找到从一个地点到另一个 地点的最短路径,以便优化成本、时间和路线等
应用
Tarjan
Robert E. "A Class of Algorithms for Decomposing Disconnected Graphs". Journal of the ACM (JACM) 16.3 (1969): 430-447
在图论中,我们通常用节点表示地点,用边表 示两个地点之间的路径。每条边都有一个与之 相关的权重,表示从一个地点到另一个地点的 距离。迪杰斯特拉算法可以找到从源节点(出 发节点)到目标节点(目的地)的最短路径,即 使在图中存在负权重的边
算法步骤
算法步骤
初始化
01
将源节点的距离设置为0,将所有其他节点的距离
设置为正无穷。创建一个空的优先队列,并将源节
点放入队列
从优先队列中取出距离最小的节点
02
这个节点就是当前最短路径的起点
遍历从这个节点出发的所有边
03
对于每条边,如果通过这条边到达的节点的距离可
以通过当前节点更新(即新距离小于原距离),那么
就更新这个节点的距离,并将其加入优先队列
如果队列中仍有节点
04
回到步骤2。否则,算法结束
算法步骤
这个算法的时间复杂度是O((E+V)logV),其中 E是边的数量,V是节点的数量
这是因为每个节点和每条边都需要被处理和比 较,而这个过程是在一个优先队列中进行的,
需要O(logV)的时间复杂度
优点和缺点
优点和缺点
迪杰斯特拉算 法的优点在于 它可以在大多 数情况下找到 最短路径,而 且实现起来相 对简单

最短路径实验报告

最短路径实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

dijkstra算法 城市最短路径问题

dijkstra算法 城市最短路径问题

dijkstra算法城市最短路径问题Dijkstra算法是一种经典的图算法,用于求解带有非负权重的图的单源最短路径问题。

在城市的交通规划中,Dijkstra算法也被广泛应用,可以帮助我们找到最短的路线来节省时间和成本。

一、最短路径问题的定义最短路径问题,指的是在一个带权重的有向图中,找到从起点到终点的一条路径,它的权重之和最小。

在城市的交通规划中,起点和终点可以分别是两个街区或者两个交通枢纽。

二、Dijkstra算法Dijkstra算法是基于贪心策略的一种算法,用于解决带非负权重的最短路径问题。

它采用了一种贪心的思想:每次从起点集合中选出当前距离起点最近的一个点,把其移到已知的最短路径集合中。

并以该点为中心,更新它的相邻节点的到起点的距离。

每次更新距离时,选择距离起点最近的距离。

三、Dijkstra算法实现1. 创建一个到起点的距离数组和一个布尔类型的访问数组。

2. 将起点的到起点的距离设置为0,其他的节点设置为无穷大。

3. 从距离数组中选择没有访问过且到起点距离最近的点,将它标记为“已访问”。

4. 对于它的所有邻居,如果出现路径缩短的情况,就更新它们的距离。

5. 重复步骤3和4,直到所有节点都被标记为“已访问”。

6. 最后,根据到起点的距离数组,以及每个节点的前驱节点数组,可以得到从起点到终点的最短路径。

四、Dijkstra算法的时间复杂度Dijkstra算法的时间复杂度可以通过堆优化提高,但最坏情况下时间复杂度仍达到O(ElogV)。

其中,E是边的数量,V是顶点的数量。

因此,Dijkstra算法在不考虑空间复杂度的情况下,是一种高效且实用的解决城市最短路径问题的算法。

五、结论Dijkstra算法是一个广泛应用于城市交通规划领域的算法,可以帮助我们找到最优的路线来节省时间和成本。

它基于贪心策略,每次从起点集合中选择距离起点最近的点,并对其邻居节点进行松弛操作。

Dijkstra算法的时间复杂度虽然较高,但堆优化可以提高算法性能。

单源最短路径(贪心法)实验报告

单源最短路径(贪心法)实验报告

算法分析与设计实验报告第 5 次实验使用贪心法求出给定图各点的最短路径,并计算算法的执行时间,分析算法的有效性。

已知一个有向网络 G=(V,E)和源点 V1,如上所示,求出从源点出发到图中其余顶点的最短路径。

1 用邻接矩阵表示有向图,并进行初始化,同时选择源点;}手动输入实现实验所给图形:随机数产生图的权值:通过这次实验,我回顾了回溯法求解最短路径问题,在其中加入了舍伍德附录:完整代码#include<stdio.h>#include<stdlib.h>#include<time.h>#define maxint 1000int c[200][200]={0};void Dijkstra(int n,int v,int dist[],int prev[]){ bool s[maxint];for(int i=1;i<=n;i++){dist[i]=c[v][i];s[i]=false;if(dist[i]==maxint) prev[i]=0;else prev[i]=v;} //找到第一个可行源点 s[]标志,记录prev[]前一个点dist[v]=0;s[v]=true;for(int i=1;i<n;i++){int temp=maxint;int u=v;for(int j=1;j<=n;j++){if((!s[j])&&(dist[j]<temp)){u=j;temp=dist[j];}}s[u]=true;for(int j=1;j<=n;j++){int newdist=dist[u]+c[u][j];if(newdist<dist[j]){dist[j]=newdist;prev[j]=u;}}}}int main(){int n,v;printf("请输入顶点数: ");scanf("%d",&n);//printf("路径: ");srand(time(0));for(int i=1;i<n+1;i++){for(int j=1;j<n+1;j++){/* scanf("%d",&c[i][j]);*/ ///手动输入if(i!=j){if((c[j][i]==0)||(c[j][i]==1000))c[i][j]=rand()%100+1;else c[i][j]=1000;if(c[i][j]>50) c[i][j]=1000;}}}printf("请输入源点: ");scanf("%d",&v);int dist[n+1],prev[n+1];printf("\n路径:\n");for(int i=1;i<n+1;i++){for(int j=1;j<n+1;j++)printf("%5d ",c[i][j]);printf("\n");}Dijkstra(n,v,dist,prev);for(int i=1;i<n+1;i++){printf("\n%d到%d的最短路径为:%d",v,i,dist[i]);}}。

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

实验六:编程实现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 <char> G;
G.Creat_Graph();
G.ShortestPath_DIJ();
G.Show_ShortestPath();
return 0;
}
3.代码实现:
#include<iostream>
#define MAX 100
#define INFINITY INT_MAX
enum BOOL{FALSE,TRUE};
using namespace std;
template <typename Type>
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();
};
template <typename Type>
void Graph<Type>::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;
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;
}
}
}
template <typename Type>
void Graph<Type>:: 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;
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];
}
cout<<" "<<"其最短的路径长度为:"<<D[i]<<endl;
}
else
{
cout<<"无法从源点"<<vexs[v0]<<"到达顶点"<<vexs[i]<<"."<<endl;
}
}
cout<<endl;
}
template <typename Type>
void Graph<Type>::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)
{ 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]<min) { v=w; min=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)
{
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 <char> G;
G.Creat_Graph();
G.ShortestPath_DIJ();
G.Show_ShortestPath();
return 0;
}
4.调试分析:
❶起先在主函数中调用类Graph时将类型参数T赋值为int从而导致用户输入的关系集合R中的元素必须为整数。

经分析后将T赋值为char,当用户输入的R的元素为int时,我们可以将其转化为char在进行后续操作,从而实现对用户输入的关系R中元素的无限制。

❷在类Graph的模板外定义成员函 G.Creat_Graph()﹑G.ShortestPath_DIJ()﹑
G.ShortestPath_DIJ()时,由于成员函数中有类型参数存在,则需要在函数外进行模块声明,并且在函数名前缀上“类名<类型参数>∷”。

5.运行结果:
下图为有向图G的带权邻接矩阵,运用Dijkstra算法计算从A到其余各顶点的最短路径以及其长度。

A B C D E F
┏┓分析可知:
A┃∞∞ 10 ∞ 30 100┃从A到C的最短路径为:A→C,其长度为10;
B┃∞∞ 5 ∞∞∞┃从A到E的最短路径为:A->E,其长度为30;
C┃∞∞∞ 50 ∞∞┃从A到D的最短路径为:A→E->D,其长度为50;
D┃∞∞∞∞∞ 10┃从A到F的最短路径为:A→E->D->F,其长度为60; E┃∞∞∞ 20 ∞ 60┃而从A无法到达B。

F┃∞∞∞∞∞∞┃易知:运行结果完全正确。

┗┛。

相关文档
最新文档