最短路径算法——Dijkstra算法
Dijkstra 算法在刚开始在学数据结构的时候,完全没弄明白,主要是也不怎么想去弄明白。而从学校出来到现在,最短路径算法都没有实际运用过,最近在一个GIS项目中总算用到了,于是乎把教材重温了下,同时查阅了网上一些资料,借鉴了一些别人的东西,并顺利用写进了项目中,文中的主要代码来自于园子里的一位大哥,这位大哥对通用框架的研究很深入,他的链接为:http://zhuweisky.cnblogs.com/archive/2005/09/29/246677.html(最短路径)。另外,文章的最后面的一些链接是我找资料的时候用到过的,有兴趣
的朋友可以去看看。
最短路径分析在事故抢修、交通指挥、GPS导航等行业应用中使用的非常广泛, 以至于大多数GIS平台都会把这个分析功能作为一个最基础的功能集成进去,如ARCGIS,SuperMap等。个人感觉想要了解这个算法的来龙去脉,一方面是参与相关书籍仔细理解,另外一个最重要的是要去调试代码。由于历史原因,对于书上的伪C代码,我是完全不感兴趣的,而且由于有严格的数学证明,所以看起来相对较难,而对于面向对象实现的算法,我很感兴趣,也感觉很容易理解,所以一边针对C#实现的面向对象代码再一边对照书籍,感觉理解的层次就加深了。
Dijkstra算法又称为单源最短路径,所谓单源是在一个有向图中,从一个顶点出发,求该顶点至所有可到达顶点的最短路径问题。要顺利实现算法,要求理解Dijstra的算法,同时还要理解图的一些基本概念,图由节点和边构成,将节点和边看成对象,每个对象有自己的特有属性,如在GIS中,一个节点必须都有ID,横坐标,纵坐标等基本属性,边有起点节点,终点节点,长度等属性,而最短路径分析,就是根据边的长度(权值)进行分析的。
边的定义如下:
节点的定义:
本次用于分析的拓扑图如下:(A为起点,D为终点,边上的数字为权值)
利用上述的边与节点的定义,可以通过代码简单的构成如下图:
有了拓扑节点和边,就可以根据算法构造其他最短路径分析的对象了,主要步骤如下:
Ø 初始化图中的从A出发的路径集合:
Ø 从A中最短路径集合中找到一个最短的路径点Vi开始分析
Ø 修正从A出发至Vi最短路径,并重新选择另一个最短路径点Vj点开始分析,重新执行上述步骤的路径分析
Ø 重复上述两个步骤,一直到所有的对象都分析完为止。
Ø 这个时候的路径集合表中已经保存了从A到任意一点的最短路径集合了。
最短路径的结果类定义如下:
文章浏览阅读2.8k次。swift 去除tableview 中多余的分割线// 去除多余的分割线let view = UIView(frame: CGRectZero)self.tableView.tableFooterView = view_swift tableview 去掉分割线
文章浏览阅读1.8k次。链接:http://pan.baidu.com/s/1pJA08jh 密码:3hlh内含安装破解步骤 一定注意要拔断网才可以破解
文章浏览阅读177次。import java.sql.*; public class ConnSqlServer2005 { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub try { ConnSqlServer2005 sql = new ConnSq..._sql2005连接数据库
文章浏览阅读1.6k次。SDL2 linux开发环境搭建记录,2016.09.28搭建成功,编译通过,sdl2 ubunt开发环境搭建记录:ubunt编译SDL2.0.4详细教程,ubuntu编译SDL2详细过程:ubuntu 16.04 x64虚拟机安装SDL2.0.4的工作记录,ubuntu搭建SDL2开发环境的过程记录:设置环境变量,开发 android要切换到root用户: 下载目前SDL官网最新的开发包SDL_sdl2库(1)-移植android 端 ubuntu
文章浏览阅读7k次。java8 stream reduce()方法使用_java stream reduce方法
文章浏览阅读2.6k次。新公司新电脑,最强 M1 芯片 MAC,兴高采烈装环境:nvm、node、yarn…然鹅,yarn install 装包时给了我重头一击…背景首先我用下面命令安装了 nvm:curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.38.0/install.sh | bash然后用 nvm 安装了 node,然后用下面命令安装了 yarncurl -o- -L https://yarnpkg.com/install.sh |._the cpu architecture "x64" is incompatible with this module.
文章浏览阅读6.4k次,点赞2次,收藏21次。目录(?)[-]一为什么要用输入法的方式实现二QT5输入法插件的结构三具体实现四测试五说明一、为什么要用输入法的方式实现要实现点击一个编辑框就跳出来一个软键盘方法很多,为什么要用输入法的方式呢?输入法的方式可以用在任一个QT程序上,而应用程序本身不需要去关心如何去输入,交给输入法就可以了。输入法与程序是独立的,两个程序通过通信的方式进行对话。就比如我们在手机上写_qt_im_module
文章浏览阅读243次,点赞2次,收藏2次。Koa框架Koa框架简介Koa初体验初始化框架1.安装框架生成器`npm install koa-generator -g`2.使用命令创建文件`koa2 koa2_stu`3.cd 到目录下使用`npm install`安装默认的框架依赖4.安装模块引擎和数据库依赖`npm install art-template koa-art-template mysql`5.修改app.js文件6.测试 `npm start`初始化模型1.创建models目录->创建stu.js模型文件2.修改app.js创_npm install koa-generator -g
文章浏览阅读389次。题目描述【问题描述】学校对本科生的成绩施行绩点制(GPA)。将学生的实际考分根据不同学科的不同学分按一定的公式进行计算。规定如下:实际成绩 绩点90-100 4.085-89 3.782-84 3.378-81 3.075-77 2.772-74 2.368-71 2.064-67 1.560-63 _1. 绩点计算器 输入:一个成绩单文件 grade.txt每行一个字符串、两个整数,用空格隔
文章浏览阅读842次。C语言跟内存分配方式 (1) 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 (2) 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 (3)从堆上分配,亦称动态内存分配。程序_alloc 汇编语言中什么意思
文章浏览阅读730次。VUE 使用echarts线图,常用属性介绍文章就是介绍应该会用得上的属性设置。这里不是安装教学哈,安装教学出门左转!介绍全在代码的备注中,请慢慢食用!methods: { myEcharts() { var that = this // 基于准备好的dom,初始化echarts实例 var myChart = this.$echarts.init(document.getElementById("main")); // 指定图表的配置项和数据 _vue的echarts等值线图
文章浏览阅读593次。java一般使用两个path:classpath 和 java.library.pathclasspath是指向jar包的位置java.library.path是非java类包的位置如(dll,so)是由于在tomcat的启动文件catalina.sh中JAVA_OPTS中指定了java.library.path..._no mrapi in java.library.path