用js简单实现一下迪克斯特拉算法
今天看书看到了迪克斯特拉算法,大概用js实现一下呢,计算最短路径。
首先,迪克斯特拉算法只适用于有向无环图,且没有负权重,本例关系图如下哦,数字为权重,emmmm,画得稍微有点丑~

//大概用js实现一下迪克斯特拉算法,计算最短路径
// (6)→ A → (1)
// ↑ ↑ ↓
// 起点 (3) 终点
// ↓ ↑ ↑
// (2) → B → (5)
//迪克斯特拉算法只适用于有向无环图,且没有负权重
//上图()内为权重
//散列表在js中表示为对象
var graph = {};//记录节点
graph.start = {};
graph.start.a = 6;//起点到达A点权重为6
graph.start.b = 2; graph.a = {};
graph.a.end = 1;
graph.b = {};
graph.b.end = 5;
graph.b.a = 3; graph.end = {}; var costs = {};//记录起点到各点权重
costs.a = 6;
costs.b = 2;
costs.end = '';//暂时不知道 var parents = {};//记录最短路径中各节点的父节点
parents.a = 'start';
parents.b = 'start';
parents.end = ''; var processed = {};//记录已处理过的节点 //找出开销最小的节点(方法比较多呢,随便写了一个)
function findLowestCostNode(costs) {
var value = '';
var node = '';
for(var key in costs) {
if(processed[key]) {
continue;
}
if(!value) {
value = costs[key];
node = key;
}else {
if(costs[key] && costs[key]<value) {
value = costs[key];
node = key;
}
}
}
return node;
} var node = findLowestCostNode(costs);//找出开销最小节点
while(node) {
var cost = costs[node];//当前最小开销
var neighbors = graph[node];//当前节点相邻节点
for(var n in neighbors) {
var newCost = cost + neighbors[n];//到达相邻节点的开销数
if (!costs[n]) {
costs[n] = newCost;
parents[n] = node;
}else {
if (costs[n] > newCost) {//检查相应节点开销数是否小于已知开销数
costs[n] = newCost;//更新相应节点开销数
parents[n] = node;//更新相应节点父节点
}
}
}
processed[node] = 1;;//记录已处理过节点
node = findLowestCostNode(costs);//更新最小节点继续循环
} console.log(costs['end']);//6 此处为最短路径开销
var line = [];
line.unshift('end');
printLine(parents['end']);
console.log(line);//["start", "b", "a", "end"] //使用递归打印出完整路径
function printLine(node) {
if( node != 'start') {
line.unshift(node);
printLine(parents[node]);
}else {
line.unshift('start');
}
}
看过的东西不使用就容易忘记,稍微记录一下,写法比较小白,大神们就自动忽略吧~
知道了新东西还真是一件有意思的事情~
用js简单实现一下迪克斯特拉算法的更多相关文章
- 广度优先搜索(BreadthFirstSearch)& 迪克斯特拉算法 (Dijkstra's algorithm)
BFS可回答两类问题: 1.从节点A出发,有前往节点B的路径吗? 2.从节点A出发,前往节点B的哪条路径经过的节点最少? BFS中会用到"队列"的概念.队列是一种先进先出(FIFO ...
- [算法导论]迪克斯特拉算法 @ Python
class Graph: def __init__(self): self.V = [] self.w = {} class Vertex: def __init__(self, x): self.k ...
- Dijkstra Algorithm 迪克特斯拉算法--Python
迪克斯拉特算法: 1.找出代价最小的节点,即可在最短时间内到达的节点: 2.更新节点的邻居的开销: 3.重复这个过程,直到图中的每个节点都这样做了: 4.计算最终路径. ''' 迪克斯特拉算法: 1. ...
- <经验杂谈>介绍Js简单的递归排列组合
最近在开发SKU模块的时候,遇到这样一个需求,某种商品有N(用未知数N来表示是因为规格的数组由用户制定且随时可以编辑的,所以对程序来说,它是一个未知数)类规格,每一类规格又有M个规格值,各种规格值的组 ...
- 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)
上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...
- c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...
- 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)
Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...
- JS实现最短路径之弗洛伊德(Floyd)算法
弗洛伊德算法是实现最小生成树的一个很精妙的算法,也是求所有顶点至所有顶点的最短路径问题的不二之选.时间复杂度为O(n3),n为顶点数. 精妙之处在于:一个二重初始化,加一个三重循环权值修正,完成了所有 ...
- Java 迪杰斯特拉算法实现查找最短距离
迪杰斯特拉算法 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是 ...
随机推荐
- jedis连接池参数minEvictableIdleTimeMillis和softMinEvictableIdleTimeMillis探索
我们通常在使用JedisPoolConfig进行连接池配置的时候,minEvictableIdleTimeMillis和softMinEvictableIdleTimeMillis这两个参数经常会不懂 ...
- PAT B1020
PAT B1020 解决思路 :贪心法,每次选取单价最高的月饼. 先上一个自己错误的解法 #include <cstdio> #include <algorithm> usin ...
- css a的伪类顺序
a:link {color: #FF0000} /* 未访问的链接 */ a:visited {color: #00FF00} /* 已访问的链接 */ a:hover {color: #FF00FF ...
- 虚拟机3种网络模式(桥接、nat、Host-only)
http://www.cnblogs.com/ggjucheng/archive/2012/08/19/2646007.html
- 关于position的一些问题
position属性: static:静止 relative:相对的 fixed:固定的 absolu:绝对的 position的一些实例子如下: HTML: <!DOCTYPE htm ...
- 运维shell全部语法进阶
Linux运维之shell脚本进阶篇 一.if语句的使用 1)语法规则 1 2 3 4 5 6 7 8 9 if [条件] then 指令 fi 或 if [条件];then ...
- Problem: 棋盘小游戏(一道有意思的acm入门题
Problem Description 现有一个2行13列的棋盘,棋盘上的任意一个位置可以向他临近的8个位置移动.棋盘上的每一个位置的标号由一个大写的英文字母表示.现在给你一个移动的顺序,问你如何设置 ...
- 微信自定义菜单errcode(40016)
最近在做微信开发,通过微信API创建自定义菜单时候出现:{"errcode":40016,"errmsg":"invalid button size ...
- git教程:版本退回
转载:版本回退 现在,你已经学会了修改文件,然后把修改提交到Git版本库,现在,再练习一次,修改readme.txt文件如下: Git is a distributed version control ...
- 2018 CCPC 网络赛 Buy and Resell
The Power Cube is used as a stash of Exotic Power. There are n cities numbered 1,2,…,n where allowed ...