最短路径之迪杰斯特拉(Dijkstra)算法

迪杰斯特拉算法是1959年由狄克斯特拉提出的,用于解决有权图中最短路径问题。该算法从起始点开始层层扩展,直至找到目标点的最短路径。本文介绍了算法的基本原理,并提供了TS代码示例,展示了如何求解图中两点间的最短路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定义

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
在这里插入图片描述
如图所示,我们要求解V0到V8的最小权值及最短路径,这是我们经常碰到的求最小路径问题之一。通过一步就将最短权值和路径求出是不现实的,不过我们可以通过迪杰斯特拉算法,将所有点及个点之间的权值转换为矩阵,也就是二维数组,然后逐步求出最短路径即可。
二维矩阵数组如下图:
在这里插入图片描述
TS代码如下:

class Dikastra{
   
  private arc:Array<any> = [];
  private numVertexes = 0; //顶点数
  private vexs:Array<string> = []; //顶点表
  private pathmatirx:Array<number> = []; // 用于存储最短路径下标的数组,下标为各个顶点,值为下标顶点的前驱顶点
  private shortPathTable:Array<number> = []; //用于存储到各点最短路径的权值和
  private final:Array<any> = []; //用于标记V0到V8每个点是否找到了最短路径

  /**
   * 生成V0 到 V8 顶点
   */
  private createVertexs(){
   
    for(let i=0;i<this.numVertexes;i++){
   
      this.vexs.push('V' + i);
    }
  }

  /**
   * 初始化状态标记及最短路径表
   */
  private initTables(){
   
    this.final.length = this.pathmatirx.length = this.shortPathTable.length = 0;
    for (let v = 0; v < this.numVertexes; v++) {
   
      this.final[v] = v === 0 ? 1 : 0; //V0默认是已找到最短路径状态
      this.shortPathTable[v] = v === 0 ? 0 : this.arc[0][v]; //V0自己到自己是0
      this.pathmatirx[v] = 0;
    }
  }

  /**
   * 执行迪杰斯特拉算法
   */
  private dijkstra(){
   
    let k:number;    //当前找到的最近路线上的最后一个顶点,通过此顶点去找最近路线上的下一个顶点
    let min:number;  //到当前顶点的最小权值,65535意味着相距无穷大(不挨着初始时距离权值是无穷大)
    for (let v = 1; v < this.numVertexes; v++) {
   
      //初始化数据
      min = 65535;
      for (let w = 0; w < this.numVertexes; w++) {
   
        //寻找离V0最近的顶点
        if (!this.final[w] && this.shortPathTable[w] < min) {
   
          k = w;
          min = this.shortPathTable[
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值