JS实现最短路径之迪杰斯特拉(Dijkstra)算法
最短路径:
对于网图来说,最短路径是指两个顶点之间经过的边上权值和最少的路径,我们称第一个顶点是源点,最后一个顶点是终点
- //定义邻接矩阵
- let Arr2 = [
- [0, 1, 5, 65535, 65535, 65535, 65535, 65535, 65535],
- [1, 0, 3, 7, 5, 65535, 65535, 65535, 65535],
- [5, 3, 0, 65535, 1, 7, 65535, 65535, 65535],
- [65535, 7, 65535, 0, 2, 65535, 3, 65535, 65535],
- [65535, 5, 1, 2, 0, 3, 6, 9, 65535],
- [65535, 65535, 7, 65535, 3, 0, 65535, 5, 65535],
- [65535, 65535, 65535, 3, 6, 65535, 0, 2, 7],
- [65535, 65535, 65535, 65535, 9, 5, 2, 0, 4],
- [65535, 65535, 65535, 65535, 65535, 65535, 7, 4, 0],
- ]
- let numVertexes = 9, //定义顶点数
- numEdges = 15; //定义边数
- // 定义图结构
- function MGraph() {
- this.vexs = []; //顶点表
- this.arc = []; // 邻接矩阵,可看作边表
- this.numVertexes = null; //图中当前的顶点数
- this.numEdges = null; //图中当前的边数
- }
- let G = new MGraph(); //创建图使用
- //创建图
- function createMGraph() {
- G.numVertexes = numVertexes; //设置顶点数
- G.numEdges = numEdges; //设置边数
- //录入顶点信息
- for (let i = 0; i < G.numVertexes; i++) {
- G.vexs[i] = 'V' + i; //scanf('%s'); //ascii码转字符 //String.fromCharCode(i + 65);
- }
- console.log(G.vexs) //打印顶点
- //邻接矩阵初始化
- for (let i = 0; i < G.numVertexes; i++) {
- G.arc[i] = [];
- for (j = 0; j < G.numVertexes; j++) {
- G.arc[i][j] = Arr2[i][j]; //INFINITY;
- }
- }
- console.log(G.arc); //打印邻接矩阵
- }
- let Pathmatirx = [] // 用于存储最短路径下标的数组,下标为各个顶点,值为下标顶点的前驱顶点
- let ShortPathTable = [] //用于存储到各点最短路径的权值和
- function Dijkstra() {
- let k, min;
- let final = [];
- for (let v = 0; v < G.numVertexes; v++) {
- final[v] = 0;
- ShortPathTable[v] = G.arc[0][v];
- Pathmatirx[v] = 0;
- }
- ShortPathTable[0] = 0;
- final[0] = 1;
- for (let v = 1; v < G.numVertexes; v++) { //初始化数据
- min = 65535;
- for (let w = 0; w < G.numVertexes; w++) { //寻找离V0最近的顶点
- if (!final[w] && ShortPathTable[w] < min) {
- k = w;
- min = ShortPathTable[w]; //w 顶点离V0顶点更近
- }
- }
- final[k] = 1; //将目前找到的最近的顶点置位1
- for (let w = 0; w < G.numVertexes; w++) { //修正当前最短路径及距离
- if (!final[w] && (min + G.arc[k][w] < ShortPathTable[w])) { //说明找到了更短的路径,修改Pathmatirx[w]和ShortPathTable[w]
- ShortPathTable[w] = min + G.arc[k][w];
- Pathmatirx[w] = k;
- }
- }
- }
- }
- function PrintVn(Vn) {
- //打印V0-Vn最短路径
- console.log("%s-%s 最小权值和: %d", G.vexs[0], G.vexs[Vn], ShortPathTable[Vn]);
- //打印最短路线
- let temp = Vn,
- str = '';
- while (temp != 0) {
- str = '->' + G.vexs[temp] + str
- temp = Pathmatirx[temp]
- }
- str = 'V0' + str;
- console.log('最短路线:'+str);
- }
- createMGraph();
- Dijkstra();
- PrintVn(8);
运行结果:
迪杰斯特拉 ( Dijkstra) 算法是 一个按路径长度递增的次序产生最短路径的算法。时间复杂度为 O(n2),n为顶点个数,如果是从其他顶点开始,那么在原有算法的基础上再来一次循环,此时的时间复杂度为O(n3)。
JS实现最短路径之迪杰斯特拉(Dijkstra)算法的更多相关文章
- [C++]单源最短路径:迪杰斯特拉(Dijkstra)算法(贪心算法)
1 Dijkstra算法 1.1 算法基本信息 解决问题/提出背景 单源最短路径(在带权有向图中,求从某顶点到其余各顶点的最短路径) 算法思想 贪心算法 按路径长度递增的次序,依次产生最短路径的算法 ...
- 最短路径算法-迪杰斯特拉(Dijkstra)算法在c#中的实现和生产应用
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先遍历思想),直到扩展到终点为止 贪心算法(Greedy ...
- 迪杰斯特拉Dijkstra算法介绍
迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijk ...
- 最短路径-迪杰斯特拉(dijkstra)算法及优化详解
简介: dijkstra算法解决图论中源点到任意一点的最短路径. 算法思想: 算法特点: dijkstra算法解决赋权有向图或者无向图的单源最短路径问题,算法最终得到一个最短路径树.该算法常用于路由算 ...
- 最短路径 - 迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析
什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...
- 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(二)
一.基于邻接表的Dijkstra算法 如前一篇文章所述,在 Dijkstra 的算法中,维护了两组,一组包含已经包含在最短路径树中的顶点列表,另一组包含尚未包含的顶点.使用邻接表表示,可以使用 BFS ...
- 单源最短路径算法:迪杰斯特拉 (Dijkstra) 算法(一)
一.算法介绍 迪杰斯特拉算法(英语:Dijkstra's algorithm)由荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年提出.迪杰斯特拉算法使用了广度优先搜索解决赋权有向图的单源最短路径问题. ...
- C# 迪杰斯特拉(Dijkstra)算法
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 其基本思想是,设置顶点集合S并不断地作 ...
随机推荐
- AcWing 143. 最大异或对
https://www.acwing.com/problem/content/145 #include <iostream> #include <algorithm> usin ...
- iOS仿UC浏览器顶部频道滚动效果
很喜欢用UC浏览器上网,当然不是给UC打广告,里面有很多酷炫的效果,值的学习,这次分享的是频道滚动的效果.动画效果如下: 实现的这个效果的关键是绘制,重写顶部Label的drawRect方法 gith ...
- NOIp2018提高组游记
Day1 T1 积木大赛 NOIp2013D2T1.....看到的时候我还以为我记错了,以为原题是一次可以随便加,这题只能加一,出考场后查了下发现一模一样. #include <iostream ...
- 《快学Scala》第一章 基础
- 把redhat源换成centos的,解决redhat未注册不能下载相关软件的问题
修改 vim /etc/yum.repos.d/centos-base.repo如下,清华源地址为 https://mirrors.tuna.tsinghua.edu.cn/help/cento ...
- Android实用代码片段
有时候,需要一些小的功能,找到以后,就把它贴到了博客下面,作为留言,查找起来很不方便,所以就整理一下,方便自己和他人. 一. 获取系统版本号: 1 PackageInfo info = this.g ...
- Java多线程—阻塞队列和生产者-消费者模式
阻塞队列支持生产者-消费者这种设计模式.该模式将“找出需要完成的工作”与“执行工作”这两个过程分离开来,并把工作项放入一个“待完成“列表中以便在随后处理,而不是找出后立即处理.生产者-消费者模式能简化 ...
- jQuery 节点操作(创建 插入 删除 复制 替换 包裹)
一,创建元素节点: 第1个步骤可以使用jQuery的工厂函数$()来完成,格式如下: $(html); $(html)方法会根据传入的HTML标记字符串,创建一个DOM对象,并将这个DOM对象包装成一 ...
- Ubuntu 16.04/Mac安装VSCode
由于Atom打开大文件经常卡死的问题,我转到了VSCode了. 下载: https://code.visualstudio.com/ (链接: https://pan.baidu.com/s/1nvz ...
- Android开发不可或缺的十大网站及工具
1. Google 做开发前完全是小白,真心不知道有Google这东西,只晓得百度,遇到问题直接百度,不是黑百度,百度在娱乐八卦方面确实靠谱,但是技术方面查出来的东西基本千篇一律,有些答案甚至还会起到 ...