当前位置: 首页 > 编程笔记 >

Javascript中的Floyd-Warshall算法

萧辰沛
2023-03-14
本文向大家介绍Javascript中的Floyd-Warshall算法,包括了Javascript中的Floyd-Warshall算法的使用技巧和注意事项,需要的朋友参考一下

Djikstra的算法用于查找从一个节点到所有其他节点的最短路径的距离/路径。在某些情况下,我们需要找到从所有节点到所有其他节点的最短路径。这是所有对最短路径算法派上用场的地方。最常用的所有对最短路径算法是Floyd Warshall算法。

Floyd Warshall算法的工作原理如下-

  • 我们将距离的N x N矩阵初始化为Infinity。

  • 然后,对于每个边u,v,我们更新此矩阵以显示该边的权重,对于边v,v,我们将权重更新为0。

  • 我们使用迭代器I,j和k创建3个嵌套循环。对于每个节点我到每个节点j的距离,我们考虑使用k作为中间点,如果发现小于现有的arr [i] [j],则更新该距离。

我们将使用一个对象,而不是使用矩阵,因为如果我们使用复杂的对象来表示每个节点,则无需跟踪索引。

现在让我们看一下相同的实现-

示例

floydWarshallAlgorithm() {
   let dist = {};
   for (let i = 0; i < this.nodes.length; i++) {
      dist[this.nodes[i]] = {};
      //对于现有的边缘,将dist设置为与weight相同
      this.edges[this.nodes[i]].forEach(e => (dist[this.nodes[i]][e.node] = e.weight));
      this.nodes.forEach(n => {
         //对于所有其他节点,将其分配给infinity-
         if (dist[this.nodes[i]][n] == undefined)
         dist[this.nodes[i]][n] = Infinity;
         //对于自身边缘,将dist分配为0-
         if (this.nodes[i] === n) dist[this.nodes[i]][n] = 0;
      });
   }
   this.nodes.forEach(i => {
      this.nodes.forEach(j => {
         this.nodes.forEach(k => {
            //检查从i到k再从k到j是否更好
            //而不是直接从i转到j。如果是,则更新
            //我将j值更改为新值
            if (dist[i][k] + dist[k][j] < dist[i][j])
               dist[i][j] = dist[i][k] + dist[k][j];
            });
         });
      });
      return dist;
   }
}

您可以使用以下方式进行测试:

示例

let g = new Graph();
g.addNode("A");
g.addNode("B");
g.addNode("C");
g.addNode("D");

g.addEdge("A", "C", 100);
g.addEdge("A", "B", 3);
g.addEdge("A", "D", 4);
g.addEdge("D", "C", 3);

console.log(g.floydWarshallAlgorithm());

输出结果

这将给出输出-

{
   A: { C: 7, B: 3, D: 4, A: 0 },
   B: { A: 3, B: 0, C: 10, D: 7 },
   C: { A: 7, D: 3, B: 10, C: 0 },
   D: { A: 4, C: 3, B: 7, D: 0 }
}
 类似资料:
  • 一、弗洛伊德算法介绍 和Dijkstra算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德命名。 基本思想 ​ 通过Floyd计算图G=(V,E)中各个顶点的最短路径时,需要引入一个矩阵S,矩阵S中的元素a[i][j]表示顶点i(第i个顶点)到顶点j(第j个顶点)的距离。

  • 旅游规划 作者 陈越 单位 浙江大学 有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。 输入格式: 输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是

  • 本文向大家介绍Javascript中的Prim算法,包括了Javascript中的Prim算法的使用技巧和注意事项,需要的朋友参考一下 Prim的算法是一种贪婪算法,可为加权无向图找到最小生成树。它找到形成树的边缘子集,该树包括每个顶点,树中所有边缘的总权重最小。 该算法的工作方式是,从任意起始顶点一次构建一个树,在每个步骤中,从树到另一个顶点添加最便宜的连接。 Prim的算法如何工作? 让我们看

  • 以下是我需要咨询以寻求帮助的问题: 编写一个贪婪算法,使用贪婪算法以尽可能少的硬币进行兑换。您将获得一个硬币值数组和一个金额:。返回一个包含每个硬币计数的数组。 例如:应该返回数组,该数组指示每枚硬币的数量:2枚50美分硬币,1枚25美分硬币,1枚10美分硬币),没有镍币(5美分),和2便士(1美分),加起来是137美分。 从computeChange返回的数组应该与第一个参数(硬币)的长度相同。

  • 问题内容: 给定以下JavaScript“类”定义,这是我想到此问题的最佳方式: 以及以下测试设置代码: 有什么方法可以使用加法运算符隐式创建为对象,如下所示… 而不是求助于… 如果不是,那么在此领域中关于通过算术运算符使自定义数字JavaScript对象可组合的最佳实践建议是什么? 问题答案: 据我所知,JavaScript(至少现在已经存在)不支持运算符重载。 我能建议的最好的方法是使用一个类

  • 问题内容: 假设我有如下JavaScript代码 这两个“ this”对象是指什么? 问题答案: 全局执行上下文中的值引用全局对象,例如: 对于功能代码,实际上取决于您如何调用该功能,例如,在以下情况下隐式设置该值: 调用没有 基础对象 引用的函数: 该值还将引用全局对象。 调用绑定为对象属性的函数 : 该值将参考。 使用运算符: 该值将引用从继承的新创建的对象。 另外,可以在调用函数时使用或方法