最短路径实验报告

合集下载

最短路径的实验报告

最短路径的实验报告

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

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

实验设计:本次实验使用了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-Warshall算法作为比较对象。

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

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

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

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

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

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

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

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

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

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

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

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的路径。

matlab最短路径实验报告

matlab最短路径实验报告

最短路径实验报告1. 背景最短路径问题是图论中的一个经典问题,它在很多实际应用中都具有重要的意义。

解决最短路径问题可以帮助我们找到两个节点之间最短的路径,这在交通规划、网络通信等领域都有广泛应用。

在本次实验中,我们将使用Matlab编程语言来解决最短路径问题。

Matlab是一种高级技术计算语言和环境,它提供了丰富的工具箱和函数库,可以方便地进行数值计算、数据可视化等操作。

通过使用Matlab,我们可以快速有效地解决最短路径问题,并得到结果。

2. 分析本次实验的目标是使用Matlab解决最短路径问题。

为了达到这个目标,我们需要进行以下步骤:2.1 数据准备首先,我们需要准备一些数据来表示图的结构。

这些数据包括节点和边的信息。

节点可以用数字或字符串来表示,边可以用两个节点之间的关系来表示。

2.2 图的表示在Matlab中,我们可以使用邻接矩阵或邻接表来表示图的结构。

邻接矩阵是一个二维数组,其中元素表示两个节点之间是否存在边。

邻接表是一个列表,其中每个节点都有一个相邻节点列表。

2.3 最短路径算法解决最短路径问题的常用算法有迪杰斯特拉算法和弗洛伊德算法。

迪杰斯特拉算法是一种贪心算法,通过不断选择当前最短路径的节点来求解最短路径。

弗洛伊德算法是一种动态规划算法,通过逐步更新节点之间的最短距离来求解最短路径。

2.4 编程实现在Matlab中,我们可以使用内置函数或编写自定义函数来实现最短路径算法。

内置函数如graphshortestpath和shortestpath可以直接调用,而自定义函数需要我们根据具体问题进行编写。

3. 结果经过实验,我们成功地使用Matlab解决了最短路径问题,并得到了正确的结果。

下面是我们得到的一些结果示例:输入:节点:A, B, C, D边:(A,B), (B,C), (C,D)输出:最短路径:A -> B -> C -> D距离:3输入:节点:A, B, C, D边:(A,B), (B,C), (C,D)输出:最短路径:A -> C -> D距离:2通过这些结果,我们可以看出Matlab的最短路径算法在解决最短路径问题上具有较高的准确性和效率。

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

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

实验报告填写说明
(实验项目名称、实验项目类型必须与实验教学大纲保持一致)
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 设置分析选项四.实验感悟实验可以提高我的实践能力,我觉得我应该加强实验。

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

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

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

二、目的学会用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个街区。

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

一、实验目的学习掌握图的存储结构利用最短路径算法,通过java编程实现最短路径输出。

二、实验环境Eclipse平台三、实验过程最短路径算法问题是计算机科学、运筹学、地理信息系统和交通诱导、导航系统等领域研究的一个热点。

传统的最短路径算法主要有Floyd算法和Dijkstra算法。

Floyd算法用于计算所有结点之间的最短路径。

Dijkstra算法则用于计算一个结点到其他所有结点的最短路径。

本程序利用Dijkstra算法用java语言实现最短路径的可视化。

流程: 画无向邻接矩阵邻接矩阵初始化求取最短路径Java文件如下M ain.java 文件:import java.awt.BorderLayout;import java.awt.Color;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event.ItemEvent;import java.awt.event.ItemListener;import java.util.StringTokenizer;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.border.TitledBorder;public class Main {public static void main(String args[]) {new UI("最短路径");}}@SuppressWarnings("serial")class UI extends JFrame implements ActionListener, ItemListener { JFrame frame;JButton button;JLabel label1, label2, label3;JComboBox list1, list2;JPanel panel1, panel2;ShortCanvas canvas;ShortInit inits;SetFont f;String circlename[];String circle1, circle2;String path[];int circlenum;int list2_index;int D[];int renum[];int num = 0;UI(String s) {super(s);canvas = new ShortCanvas();add(canvas,BorderLayout.CENTER);f=new SetFont();inits = new ShortInit();circlename = inits.getcirclename();circlenum =inits.getcirclenum();circle1 = circlename[0];circle2 = circlename[0];panel2 = new JPanel();panel2.setBorder(new TitledBorder("最短路径"));panel2.setBackground(Color.white);panel2.setLayout(new FlowLayout(FlowLayout.LEADING, 5, 5));label1 = new JLabel("起点", JLabel.LEFT);label1.setFont(f.setSysFontAndFace());panel2.add(label1);list1 = new JComboBox();list1.addItemListener(this);list1.setMaximumRowCount(5);// 设置 JComboBox 显示的最大行数panel2.add(list1);label2 = new JLabel("终点");label2.setFont(f.setSysFontAndFace());panel2.add(label2);list2 = new JComboBox();list2.addItemListener(this);panel2.add(list2);list2.setMaximumRowCount(5);// 设置 JComboBox 显示的最大行数for (int i = 0; i < circlenum; i++) {list1.addItem(circlename[i]);list2.addItem(circlename[i]);}button = new JButton("确定");button.addActionListener(this);button.setFont(f.setSysFontAndFace());panel2.add(button);label3 = new JLabel("");label3.setFont(f.setSysFontAndFace());panel2.add(label3);add(panel2,BorderLayout.SOUTH);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100, 100, 530, 547);setVisible(true);validate();}public void itemStateChanged(ItemEvent e) {if (e.getSource() == list1)circle1 = (String) list1.getSelectedItem();if (e.getSource() == list2) {circle2 = (String) list2.getSelectedItem();list2_index = list2.getSelectedIndex();}}public void actionPerformed(ActionEvent e) {if (e.getSource() == button) {ShortPath sp = new ShortPath(circle1, circle2);path = sp.getpath();D = sp.getD();label3.setText("最短路径为:" + D[list2_index]);renum = new int[circlenum];StringTokenizer fenxi = newStringTokenizer(path[list2_index], "->");num = 0;while (fenxi.hasMoreTokens()) {String str = fenxi.nextToken();for (int i = 0; i < circlenum; i++) {if (str.equals(circlename[i])) {renum[num] = i;num++;}}}canvas.flag = 1;canvas.resultroad = renum;canvas.num = num;canvas.repaint();}}}SetFont.java文件import java.awt.Font;import javax.swing.JFrame;import javax.swing.UIManager;import javax.swing.UnsupportedLookAndFeelException;//系统外观处理@SuppressWarnings("serial")public class SetFont extends JFrame {public Font setSysFontAndFace() {try {// 根据类名称设置外观UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel" );} catch (UnsupportedLookAndFeelException ex) {} catch (IllegalAccessException ex) {} catch (InstantiationException ex) {} catch (ClassNotFoundException ex) {}Font font = new Font("新宋体", Font.ITALIC + Font.BOLD, 17);return font;}}ShortCanvas.java文件://画无向邻接矩阵import java.awt.Canvas;import java.awt.Color;import java.awt.Graphics;@SuppressWarnings("serial")public class ShortCanvas extends Canvas {SetFont f;ShortInit init;String circlename[];int roadlength[];int arcs[][]; // 带权邻接矩阵int circlenum;int roadnum;int location[][]; // 各点坐标int flag = 0;int num;int resultroad[];// 结果线路ShortCanvas() {f = new SetFont();init = new ShortInit();circlename = init.getcirclename();roadlength = init.getroadlength();circlenum = init.getcirclenum();roadnum = init.getroadnum();arcs = new int[circlenum][circlenum];location = new int[circlenum][2];for (int i = 0; i < circlenum; i++)for (int j = 0; j < circlenum; j++)arcs[i][j] = 10000;set();}public void paint(Graphics g) {g.setFont(f.setSysFontAndFace());g.drawOval(60, 60, 25, 25); // ag.drawString(circlename[0], 70, 75);g.drawString(String.valueOf(roadlength[0]), 135, 135);g.drawOval(200, 180, 25, 25); // bg.drawString(circlename[1], 210, 195);g.drawLine(70, 85, 200, 192); // a--bg.drawOval(100, 300, 25, 25); // cg.drawString(circlename[2], 110, 315);g.drawString(String.valueOf(roadlength[1]), 90, 195);g.drawLine(70, 85, 112, 300); // a--cg.drawString(String.valueOf(roadlength[2]), 165, 250);g.drawLine(200, 192, 112, 300); // b--cg.drawOval(350, 180, 25, 25); // dg.drawString(circlename[3], 360, 195);g.drawString(String.valueOf(roadlength[3]), 285, 190);g.drawLine(225, 192, 350, 192); // b--dg.drawOval(250, 360, 25, 25); // gg.drawString(circlename[4], 260, 375);g.drawString(String.valueOf(roadlength[4]), 185, 345);g.drawLine(125, 315, 250, 375); // c--gg.drawString(String.valueOf(roadlength[5]), 305, 270);g.drawLine(275, 372, 350, 192); // g--dg.drawOval(450, 80, 25, 25); // eg.drawString(circlename[5], 460, 95);g.drawString(String.valueOf(roadlength[6]), 420, 150);g.drawLine(375, 192, 462, 105); // d--eg.drawOval(480, 300, 25, 25); // fg.drawString(circlename[6], 490, 315);g.drawString(String.valueOf(roadlength[7]), 465, 205);g.drawLine(462, 105, 492, 300); // e--fg.drawString(String.valueOf(roadlength[8]), 420, 280);g.drawLine(375, 192, 480, 312); // d--fg.drawString(String.valueOf(roadlength[9]), 370, 330);g.drawLine(275, 372, 480, 312); // g--fg.drawString(String.valueOf(roadlength[10]), 260, 85);g.drawLine(70, 85, 450, 92); // a--eint i, j;if (flag == 1) {g.setColor(Color.red);for (i = 0; i < num - 1; i++) {j = i + 1;g.drawLine(location[resultroad[i]][0] + 12,location[resultroad[i]][1] + 12,location[resultroad[j]][0] + 12,location[resultroad[j]][1] + 12);}}}public void set() {location[0][0] = 60;location[0][1] = 60;location[1][0] = 200;location[1][1] = 180;location[2][0] = 100;location[2][1] = 300;location[3][0] = 350;location[3][1] = 180;location[4][0] = 250;location[4][1] = 360;location[5][0] = 450;location[5][1] = 80;location[6][0] = 480;location[6][1] = 300;arcs[0][1] = arcs[1][0] = roadlength[0];arcs[0][2] = arcs[2][0] = roadlength[1];arcs[1][2] = arcs[2][1] = roadlength[2];arcs[1][3] = arcs[3][1] = roadlength[3];arcs[2][4] = arcs[4][2] = roadlength[4];arcs[4][3] = arcs[3][4] = roadlength[5];arcs[3][5] = arcs[5][3] = roadlength[6];arcs[5][6] = arcs[6][5] = roadlength[7];arcs[3][6] = arcs[6][3] = roadlength[8];arcs[4][6] = arcs[6][4] = roadlength[9];arcs[0][5] = arcs[5][0] = roadlength[10];}public int[][] getarcs() {return arcs;}}ShortInit.java文件:public class ShortInit {int circlenum=7;int roadnum=9;int num[];String circlename[];int roadlength[];ShortInit (){circlename=new String[10];roadlength=new int[15];circlename[0]="a";circlename[1]="b";circlename[2]="c";circlename[3]="d";circlename[4]="g";circlename[5]="e";circlename[6]="f";roadlength[0]=7;roadlength[1]=6;roadlength[2]=3;roadlength[3]=20;roadlength[4]=5;roadlength[5]=3;roadlength[6]=9;roadlength[7]=6;roadlength[8]=8;roadlength[9]=11;roadlength[10]=8;}public String[] getcirclename(){return circlename;}public int[] getroadlength(){return roadlength;}public int getcirclenum(){return circlenum;}public int getroadnum(){return roadnum;}}Shortpath.java 文件//求取最短路径public class ShortPath {int maxlength = 10000;int maxcirclenum = 30;ShortInit init;ShortCanvas canvas;String circlename[];String start, end;String path[];int arcs[][];int circlenum;int roadnum;int v0;int D[];ShortPath(String s1, String s2) {init = new ShortInit();canvas = new ShortCanvas();circlename = init.getcirclename();circlenum = init.getcirclenum();roadnum = init.getroadnum();start = s1;end = s2;arcs = canvas.getarcs();path = new String[circlenum];for (int p = 0; p < circlenum; p++)path[p] = start;for (int k = 0; k < circlenum; k++) {if (start.equals(circlename[k])) {v0 = k;}}shortestpath(v0);}public void shortestpath(int v0) {int v, i, w;int min;boolean finald[] = new boolean[maxcirclenum];D = new int[maxcirclenum];boolean p[][] = new boolean[maxcirclenum][maxcirclenum];for (v = 0; v < circlenum; v++) {finald[v] = false;D[v] = arcs[v0][v];for (w = 0; w < circlenum; ++w)p[v][w] = false;if (D[v] < maxlength) {p[v][v0] = true;p[v][v] = true;}}D[v0] = 0;finald[v0] = true;for (i = 1; i < circlenum; i++) {min = maxlength;for (w = 0; w < circlenum; w++)if (!finald[w])if (D[w] < min) {v = w;min = D[w];}finald[v] = true;path[v] = path[v] + "->" + circlename[v];for (w = 0; w < circlenum; w++) {if (!finald[w] && (min + arcs[v][w] < D[w])) {D[w] = min + arcs[v][w];path[w] = path[v];p[w][w] = true;}}}for (int j = 0; j < circlenum; ++j) {System.out.println(path[j] + ": "+ String.valueOf(D[j]) + "km");}}public String[] getpath() {return path;}public int[] getD() {return D;}}四、实验结果五、实验体会通过这次实验,懂得了如何通过邻接矩阵存储图,然后利用迪杰斯特拉算法算出最短路径。

相关文档
最新文档