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

2023-05-16

往期文章目录

【干货满满!】【最小生成树】Prim算法

                         【最小生成树】Kruskal算法


目录

前言

一、最短路径的概念及应用

二、Dijkstra迪杰斯特拉

1.什么是Dijkstra

2.逻辑实现

总结


前言

  无论是什么程序都要和数据打交道,一个好的程序员会选择更优的数据结构来更好的解决问题,因此数据结构的重要性不言而喻。数据结构的学习本质上是让我们能见到很多前辈在解决一些要求时间和空间的难点问题上设计出的一系列解决方法,我们可以在今后借鉴这些方法,也可以根据这些方法在遇到具体的新问题时提出自己的解决方法。(所以各种定义等字眼就不用过度深究啦,每个人的表达方式不一样而已),在此以下的所有代码都是仅供参考,并不是唯一的答案,只要逻辑上能行的通,写出来的代码能达到相同的结果,并且在复杂度上差不多,就行了。


一、最短路径的概念及应用

在介绍最短路径之前我们首先要明白两个概念:什么是源点,什么是终点?在一条路径中,起始的第一个节点叫做源点;终点:在一条路径中,最后一个的节点叫做终点;注意!源点和终点都只是相对于一条路径而言,每一条路径都会有相同或者不相同的源点和终点。 

而最短路径这个词不用过多解释,就是其字面意思:在图中,对于非带权无向图而言,从源点到终点边最少的路径(也就是BFS广度优先的方法);而对于带权图而言,从源点到终点权值之和最少的路径叫最短路径;

最短路径应用:道路规划;

我们最关心的就是如何用代码去实现寻找最短路径,通过实现最短路径有两种算法:Dijkstra迪杰斯特拉算法和Floyd弗洛伊德算法,接下来我会详细讲解Dijkstra迪杰斯特拉算法;

二、Dijkstra迪杰斯特拉

1.什么是Dijkstra

Dijkstra迪杰斯特拉是一种处理单源点的最短路径算法,就是说求从某一个节点到其他所有节点的最短路径就是Dijkstra;

2.逻辑实现

在Dijkstra中,我们需要引入一个辅助变量D(遇到解决不了的问题就加变量[_doge]),这个D我们把它设置为数组,数组里每一个数据表示当前所找到的从源点V开始到每一个节点Vi的最短路径长度,如果V到Vi有弧,那么就是每一个数据存储的就是弧的权值之和,否则就是无穷大;

我们还需要两个数组P和Final,它们分别表示:源点到Vi的走过的路径向量,和当前已经求得的从源点到Vi的最短路径(也就是作为一个标记表示该节点已经加入到最短路径中了);

 那么对于如下这个带权无向图而言,我们应该如何去找到从V0到V8的最短路径呢;

在上文中我们已经描述过了,在从V0到V8的这一条最短路径中,V0自然是源点,而V8自然是终点;于是我根据上文的描述具现化出如下的表格;

 在辅助向量D中,与源点V0有边的就填入边的权值,没边就是无穷大;

构建了D、P和Final,那么我们要开始遍历V0,找V0的所有边中权值最短的的边,把它在D、P、Final中更新;

具体是什么意识呢?在上述带权无向图中,我们可以得到与源点有关的边有(V0,V1)和(V0,V2),它们的权值分别是1和5,那么我们要找到的权值最短的的边,就是权值为1 的(V0,V1),所以把Final[1]置1,表示这个边已经加入到最短路径之中了;

而原本从V0到V2的距离是5,现在找到了一条更短的从V0 -> V1 -> V2距离为4,所以D[2]更新为4,P[2]更新为1,表示源点到V2经过了V1的中转;

继续遍历,找到从V0出发,路径最短并且final的值为0的节点。因为经过节点V1的中转,源点到V3和V4有了路径,从源点到V3的距离是1+7==8,到V4的距离是1+5==6,把它们在D中更新;再以V1为中心,去找与V1有关的边中权值最短的边,可以得到此时V0到V2的距离为4,是我们要找的边,于是把V2加入到最短路径中;

重复上述步骤,遍历以V2为中心的顶点,与V2有关的顶点有V0、V1、V4、V5,其中0和1已经加入到最短路径中了所以不管它们,而V2到V4的路径最短,所以将Final[4]置1;那么V0到V4原来的距离是6,而现在经过V2的中转,V0到V1到V2到V4的距离为5,所以更新D、P;

接着找以V4为中心,与V4有关的边:V3、 V5、V6、 V7更新D、P,原本V0到V3是距离8,现在是更新为7,且我们可以发现这条边的权值最小,所以把Final[3]置1;

 现在V3最短,所以以V3为中心,到V6的距离最近,所以更新D[6]、P[6]和Final[6];

  现在V6最短,所以以V6为中心,到V7的距离最近,所以更新D[7]、P[7]和Final[7];

现在V7最短,所以以V7为中心,到V8的距离最近,所以更新D[8]、P[8]和Final[8];

 至此,源点和终点都被加入到了最短路径当中,Dijkstra算法结束;那么我们从P[8]开始从后往前推,就可以得到这个带权无向图的从V0到V8的最短路径;

如图所示从P[8]开始从后往前推算,数组P中的值就是在最短路径中该节点的上一个节点;可以得到:V8<-V7<-V6<-V3<-V4<-V2<-V1<-V0;即如下图所示:

 3.代码实现

逻辑上理顺了,那么问题来了,代码要怎么写?因为是带权的无向图,所以这里我们还是以邻接矩阵去构建图(关于邻接矩阵的详细概念在我往前的文章里有),这里还是简单说一下,如果Vi到Vj有边,那么存入的就是这条边的权值,如果没有边就存入一个不可能的数表示无穷大(如65535)

void creategrahp(AdjMatrix* G)
{
    int n, e;//n代表顶点数 e代表边数
    int vi, vj;//vi vj代表边的两个顶点对
    int w;//表示边的权值
    printf("要输入的顶点数和边数\n");
    scanf("%d%d",&n,&e);
    G->numV = n; 
    G->numE = e;
    //图的初始化
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            if(i == j)
            {
                //一个非带权的图 0代表没有边 1代表有边
                //边不指向自己 即对角线为0
                G->Edge[i][j] = 0;
            }
            else
            {
                //如果是带权的图 初始化为0或者为一个不可能的值
                G->Edge[i][j] = 65535;
            }
        }
    }
    //将顶点存入数组
    for(int i = 0; i < G->numV; i++)
    {
        printf("请输入第%d个节点的信息\n",i + 1);
        scanf("%d", &G->Vertices[i]);
    }
    //输入边的信息
    for(int i = 0; i< G->numE; i++)
    {
        //如果输入的是顶点的值 需要从顶点集中查找对应的下标 
        //如果是带权图 还要输入权的信息
        printf("请输入边的信息Vi,Vj和权值w\n");
        scanf("%d%d%d",&vi,&vj,&w);
        G->Edge[vi][vj] = w;
        //如果是带权图 等于权值
        //如果是有向图 就不对称
        //如果是无向图 矩阵对称
        G->Edge[vj][vi] = w;
    }
}

至于Dijkstra的代码实现也很简单,只要按照上文中逻辑去实现就可以了;我每一步代码都详细写了注释,如果还有不清楚的可以私信问我;

首先我们要初始化D、P和Final;D初始存入与源点有关的边的权值;P一开始可以初始化为0或-1表示没有路径;Final初始化为0表示没有被加入到最短路径的标志;

void ShortPath_Dijkstra(AdjMatrix* G, int v0, P* p, D* d)
{
    int k;//记录当前最短路径的下标
    int final[200];//final[x] = 1 表示已求得的到v0的最短路径
    //初始化DPFinal
    for(int i = 0; i < G->numV; i++)
    {
        final[i] = 0;//初始化为未知状态
        (*d)[i] = G->Edge[v0][i];//如果v0传进的是值 寻找下标
        (*p)[i] = -1;
    }
    final[v0] = 1;
    (*d)[v0] = 0;//自己到自己的路径为0

接下来就是找权值最短的边;用变量K记录找到的边最小的顶点的下标;

//主循环 求每次v0到v的最短路径
    for(int i = 1; i < G->numV; i++)
    {
        int min = 65535;
        //寻找与v0距离最近的顶点
        for(int j = 0; j < G->numV; j++)
        {
            if(final[j] != 1 && (*d)[j] < min)
            {
                min = (*d)[j];
                k = j;
            }
        }
        //把Vk加入到最短路径中
        final[k] = 1;

然后以K为中转,找以K为中心的邻接点到源点的距离,如果这个距离小于原来的距离那么更新D和P;如此循环直到所有的点都被加入到了最短路径中,结束!

 //修正当前最短路径的距离
        //以Vk作为中转,更新以Vk为中心的邻接点到V0的距离
        for(int j = 0; j < G->numV; j++)
        {
            //如果当前找到v的顶点的路径小于原来的路径长度
            if(min + G->Edge[k][j] < (*d)[j] && final[j] != 1)
            {
                //说明找到了更短的路径 修改DP
                (*d)[j] = min + G->Edge[k][j];
                (*p)[j] = k;
            }
        }

总结

全部代码

#include<stdio.h>
#include<stdlib.h>
//最短路径算法 迪杰斯特拉 求有向图G 从某一个顶点开始 到其余各个顶点的最短路径P以及带权长度
//P为前驱顶点的下标 D为从选取的顶点V0到V顶点的最短路径长度

typedef int P[200];//储存最短路径下标
typedef int D[200];//v0到v的最短路径长度和

//邻接矩阵
typedef struct AdjacentMatrix
{
    //顶点集
    int Vertices[200];
    //边集
    int Edge[200][200];
    //顶点数 边数
    int numV, numE;
}AdjMatrix;

void creategrahp(AdjMatrix* G)
{
    int n, e;//n代表顶点数 e代表边数
    int vi, vj;//vi vj代表边的两个顶点对
    int w;//表示边的权值
    printf("要输入的顶点数和边数\n");
    scanf("%d%d",&n,&e);
    G->numV = n; 
    G->numE = e;
    //图的初始化
    for(int i = 0; i < n; i++)
    {
        for(int j = 0; j < n; j++)
        {
            if(i == j)
            {
                //一个非带权的图 0代表没有边 1代表有边
                //边不指向自己 即对角线为0
                G->Edge[i][j] = 0;
            }
            else
            {
                //如果是带权的图 初始化为0或者为一个不可能的值
                G->Edge[i][j] = 65535;
            }
        }
    }
    //将顶点存入数组
    for(int i = 0; i < G->numV; i++)
    {
        printf("请输入第%d个节点的信息\n",i + 1);
        scanf("%d", &G->Vertices[i]);
    }
    //输入边的信息
    for(int i = 0; i< G->numE; i++)
    {
        //如果输入的是顶点的值 需要从顶点集中查找对应的下标 
        //如果是带权图 还要输入权的信息
        printf("请输入边的信息Vi,Vj和权值w\n");
        scanf("%d%d%d",&vi,&vj,&w);
        G->Edge[vi][vj] = w;
        //如果是带权图 等于权值
        //如果是有向图 就不对称
        //如果是无向图 矩阵对称
        G->Edge[vj][vi] = w;
    }
}


void ShortPath_Dijkstra(AdjMatrix* G, int v0, P* p, D* d)
{
    int k;//记录当前最短路径的下标
    int final[200];//final[x] = 1 表示已求得的到v0的最短路径
    //初始化DPFinal
    for(int i = 0; i < G->numV; i++)
    {
        final[i] = 0;//初始化为未知状态
        (*d)[i] = G->Edge[v0][i];//如果v0传进的是值 寻找下标
        (*p)[i] = -1;
    }
    final[v0] = 1;
    (*d)[v0] = 0;//自己到自己的路径为0

    //主循环 求每次v0到v的最短路径
    for(int i = 1; i < G->numV; i++)
    {
        int min = 65535;
        //寻找与v0距离最近的顶点
        for(int j = 0; j < G->numV; j++)
        {
            if(final[j] != 1 && (*d)[j] < min)
            {
                min = (*d)[j];
                k = j;
            }
        }
        //把Vk加入到最短路径中
        final[k] = 1;
        //修正当前最短路径的距离
        //以Vk作为中转,更新以Vk为中心的邻接点到V0的距离
        for(int j = 0; j < G->numV; j++)
        {
            //如果当前找到v的顶点的路径小于原来的路径长度
            if(min + G->Edge[k][j] < (*d)[j] && final[j] != 1)
            {
                //说明找到了更短的路径 修改DP
                (*d)[j] = min + G->Edge[k][j];
                (*p)[j] = k;
            }
        }
    }
}

int main()
{
    AdjMatrix* G = (AdjMatrix*)malloc(sizeof(AdjMatrix));
    int p[200];
    int d[200];
    creategrahp(G);
    int v0 = 0;
    ShortPath_Dijkstra(G, v0, &p, &d);
    for (int i = 1; i < G->numV; i++)
    {
        printf("v%d - v%d:", v0, i);
        int j = i;
        while (p[j] != -1)
        {
            printf("%d", p[j]);
            j = p[j];
        }   
        printf("\n");
    }

    printf("最短路径长度");
    for (int i = 1; i < G->numV; i++)
    {
        printf("v%d-v%d : %d\n", G->Vertices[0], G->Vertices[i], d[i]);
    }
    system("pause");
    return 0;
}

需要注意的是:DIjkstra迪杰斯特拉算法只能找从某一个顶点开始,到其余各个顶点的最短路径P以及带权长度;那么如果我想要知道任意两个节点之间的最短路径要怎么办呢?大家可以思考一下,我们下期再讲~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图解迪杰斯特拉(Dijkstra)最短路径算法 的相关文章

  • AirSim相机、IMU内外参分析(VIO、vSLAM)

    作者 朱贞欣 xff0c 公ZH xff1a SLAM学习er 文章目录 0 引入1 世界坐标系2 IMU2 1 IMU数据生成2 2 关于IMU噪声 3 相机3 1 相机外参3 2 内参 0 引入 假设你想通过AirSim获取仿真数据运行
  • C++ cout输出小数位数

    方法一 xff1a 使用setiosflags span class token macro property span class token directive hash span span class token directive
  • kubeadm init 运行时kebelet启动失败问题

    最近在部署kebeedge xff0c 需要先在云服上部署k8s xff0c 期间通过kubeadm init config的方式进行master的部署 xff0c 记录一下遇到的kubelet相关的错误 在通过kubeadm init c
  • 2288hv5超融合服务器 数码管报888

    问题现象 2288hv5超融合服务器 xff0c 前面板数码管报888 xff0c 电源灯黄灯闪烁 xff0c 开不了机 xff0c ibmc网络是通的 xff0c 但是web网页打不开 问题原因 iBMC的版本过低 xff0c iBMC在
  • 跟我一起写操作系统(二)——史上最简单的内核

    跟我一起写操作系统 二 史上最简单的内核 转载注明出处 xff1a http www cnblogs com lucasysfeng p 4847662 html 上一讲地址 xff1a http www cnblogs com lucas
  • k8s中文文档

    http www cnblogs com huangzhenyou p 8066145 html k8s概念比较多 xff0c 有什么概念的疑惑的推荐看k8s中文文档 me的环境 操作系统 xff1a centos7 docker xff1
  • 阿里云 CentOS7 安装图形化界面 。安装图形化界面看这一篇就够了。

    阿里云centos7 下执行eclipse 响应学校老师的要求安装eclipse用于与hadoop的操作 在这之前想过两种方法来解决服务器无图形化界面 xff0c 来操作eclipse 1 在主机上下载eclipse把需要编译的代码编译成j
  • 把ESXi中的虚拟机通过OVA/OVF导出的方式迁移到Proxmox 5

    一 前言 之前发现ESXi是免费的时候 xff0c 非常兴奋地把几台服务器都装上了 xff0c 用着确实还行 xff0c 但是用久了之后就发现 xff0c 很多高端功能需要进一步付费才能使用 xff0c 比如HA等 另外就是它还有很多局限性
  • PX4 ThoneFlow光流使用

    PX4官方光流介绍 xff1a PMW3901 Based Flow Sensors PX4 User Guide 与飞控连接 接线 xff1a G接GND xff1b V接3 3V xff1b T是TX接飞控的RX口 xff1b Y接地开
  • Ubuntu PX4无人机仿真环境配置

    目录 一 VM虚拟机安装ubuntu18 04 1 VMware安装 2 新建虚拟机 二 Ubuntu系统配置 1 更改软件安装源 2 安装中文输入法 三 PX4环境搭建 1 安装git 2 下载px4源码 3 安装ROS 4 安装MAVR
  • larave5安装过程分享-MAX OSX版本

    MAC上的平台是XAMPP xff0c 自带的版本低 我用的是XAMPP MAC版本 一 本地php环境配置 which php php xff0d v xff5c php xampp php PASH 61 34 xff0f applic
  • PX4二次开发 创建进程

    目录 一 创建进程 二 仿真测试 PX4官方手册 xff1a Module Template for Full Applications PX4 User Guide 编写参照PX4源码 src templates xff1a PX4 Au
  • 【Matlab】Matlab基础绘图整理

    Matlab基础绘图整理 一张图绘制多个子图在图片文本中添加希腊字母和特殊字符其他常用函数限制坐标轴范围添加坐标轴说明添加图例修改线条类型 标记修改线条粗细 一张图绘制多个子图 主要命令 xff1a figure 第几张图 subplot
  • PX4 磁罗盘干扰分析

    磁罗盘干扰分析 推力与磁场关系正常情况干扰情况与推力相关解决方法 与推力不相关 罗盘补偿操作流程获取用于分析的日志分析日志调整罗盘补偿参数 推力与磁场关系 无人机上的电机电流会干扰无人机上搭载的磁罗盘 xff0c PX4官方提供了一些方式
  • 【C++】进制

    目录 一 进制转换1 十进制转二进制2 十进制转八进制 xff08 同上 xff09 3 二进制转八进制4 二进制转十六进制5 八进制转二进制6 十六进制转二进制 二 位运算1 原码 反码 补码2 位运算符3 变换操作 一 进制转换 1 十
  • Ubuntu20.04安装ROS2+ROS2-PX4框架搭建

    目录 Ubuntu20 04安装ROS2Set localeSetup SourcesInstall ROS2 packageEnvironment setup测试 ROS2 PX4框架搭建Install PX4Install ROS2Se
  • Jetson Nano利用ROS2通过MicroDDS与PX4通讯

    目录 Jetson Nano安装Ubuntu20 04Ubuntu20 04 配置ROS2环境Pixhawk配置Jetson Nano上MicroDDS Agent配置及和pixhawk通讯 PX4在V1 14及后续版本中 xff0c 将原
  • 用速腾RS16跑LeGO-LOAM

    版权声明 xff1a 本文为博主原创文章 xff0c 遵循 CC 4 0 BY SA 版权协议 xff0c 转载请附上原文出处链接和本声明 本文链接 xff1a https blog csdn net Zed Of Zoe article
  • Visual Studio 2017环境配置MPI v9.0 并行编程环境

    目录 第一步 xff1a 下载安装mpi 官网 xff1a http www mpich org windows版官网 xff1a https msdn microsoft com en us library bb524831 v 61 v
  • 学习java基础的心得感悟

    学完java基础 xff0c 对java面向对象的思想有更加深刻的认识了 xff0c 从学习java语言概述到最后网络编程IDE的使用 xff0c 时间用了1个月零9天 xff0c 上课时间28天 xff0c 回首感觉快又感觉漫长 xff0

随机推荐

  • 如何使用SQL批量替换数据库特定字段中部分特定数据

    1 替换数据库特定字段中部分特定数据的SQL语句 SQL语句 xff1a update 表名 set 字段名 61 replace 字段名 原字符串 需要替换成的字符串 以将表exam major中的字段pos2019中的数据 50 替换成
  • 阿里云ubuntu16.04 server 配置方案 1 配置桌面环境

    首先为服务器配置一个桌面系统 升级一下哦 xff01 span class hljs built in sudo span apt get update span class hljs built in sudo span apt get
  • Xshell远程连接华为云服务器

    Xshell远程连接华为云服务器 一 关于华为云1 什么是云服务器2 为什么使用华为云3 我的华为云体验 二 控制台操作 1 设置密码 2 开放端口 3 切换系统 三 Xshell操作 1 下载Xshell和Xftp2 连接云服务器 一 关
  • 校园网网络连接反复断开又连接是什么原因?

    网络连接反复断开又连接是什么原因 xff1f 原因可能跟ARP攻击或擅自使用P2P终结者等攻击软件有关 因为校园内多个楼宇已部署防ARP攻击网络设备 xff0c 只要判断用户计算机感染ARP或使用P2P终结者 网络执法官 聚生网管等软件攻击
  • xuperchain源码分析-启动过程

    xuperchain的启动分为两个比较大的过程 xff0c 一个是节点的初始化 xff0c 另一个是挖坑的初始化
  • 通过Excel学习PID算法(一步步理解它的KP,KI,KD)

    PID原理 PID控制算是应用非常广泛的经典控制算法 但是怎么理解PID这三个参数呢 xff1f 在参考了别人的文章之后 xff0c 我还是有点一知半解 xff0c 这时候发现不自己动手算一算是很难理解PID了 xff0c 但是我又不想做这
  • 通过Excel学习PID算法(连续系统的PID)

    总结上一节 在之前 xff0c 我们用倒水的例子通俗易懂的解释了什么是PID算法 在这里先回顾一下之前的学习的内容 P表示对误差的比例系数 与目标值差多少 xff0c 就在下一次修正中加上这个误差与P的乘积 xff0c 同时会导致系统有一个
  • 原来学习是如此地苦涩

    原文链接 xff1a http blog csdn net tangl 99 article details 2047657 最近一直在忙第一篇Paper xff0c 虽然想法大致的框架成熟了 xff0c 但是还有一些细节需要完善 这几天在
  • 互联网+时代的7个引爆点(读书笔记)

    百货商场里的销售人员一直抱怨 xff0c 大家只是到自己这里来看看 xff0c 之后转身就在网上下单 从旧视角瞎看这固然是一种文体 xff0c 显示着揭示了一种新的机会 以线下体验为入口的机会 小团队精益式的迭代 xff0c 几个周期后就可
  • maperuce运算框架

    1 xff0c 概念 mapreduce 运算框架主要实现hadoop 的数据处理 xff0c 数据处理中 流经过5个节点 数据流 xff1a input gt spilt gt map gt shuffle gt reduce xff08
  • 在Python中使用print输出时,出现UnicodeEncodeError错误,错误提示为“‘gbk‘ codec can‘t encode character ‘\u2022‘ in posit

    利用chatgpt一步步解决了这个问题 xff0c 感觉ChatGPT还是太强大了 问题描述 xff1a 在Python中使用print输出时 xff0c 出现UnicodeEncodeError错误 xff0c 错误提示为 39 gbk
  • openstack一些特性资料

    Keystone RBAC nova compute Cells Bare Metal Compute 是什么东西 xff1f http wiki openstack org blueprint nova compute cells htt
  • 【神经网络和深度学习-开发案例】 第二章 神经网络结构

    神经网络和深度学习 第二章 神经网络结构 案例 xff1a 使用神经网络识别手写数字 我将介绍一个神经网络 xff0c 它可以很好地对手写的数字进行分类 为了准备这一点 xff0c 它有助于解释一些术语 xff0c 让我们可以命名一个网络的
  • 2000页kubernetes操作手册,内容详细代码清晰,小白也能看懂

    现如今 xff0c Kubernetes业务已成长为新时代的IT基础设施 xff0c 并成为高级运维工程师 架构师 后端开发工程师的必修技术栈 毫无疑问 xff0c Kubernetes是云计算发展演进的一次彻底革命性的突破 xff0c 只
  • FreeRTOS代码阅读笔记:heap_4.c

    FreeRTOS中对于内存的管理当前一共有5种实现方式 xff08 作者当前的版本是10 1 1 xff09 xff0c 均在 Source portable MemMang 下面 xff0c 这里笔记下 heap 4 c和第二种方式比较相
  • (1)touchgfx 添加时钟控件

    第一步 xff1a 新建空白模版 添加图片 xff1a 放入 链接 xff1a https pan baidu com s 1NI6LUYrTUs64Z2jZE6AAQQ 提取码 xff1a 2odw 添加控件 xff1a 位置部件属性1T
  • 【基于51】红外寻迹智能小车 - 代码篇

    文章目录 前言一 准备工作二 使用步骤1 模块化编程2 电机模块3 小车动作模块4 PWM 和定时器 中断系统5 寻迹逻辑 总结 前言 关于硬件部分可以看我上次写的帖子https blog csdn net ZER00000001 arti
  • C++关键字override

    一 什么是override override的翻译是覆盖 实际上它在C 43 43 中可以检测哪些虚函数没有被重写并报错 注 xff1a 在派生类的成员函数中使用override时 xff0c 如果基类中无此函数 xff0c 或基类中的函数
  • 邻接矩阵和邻接表

    图的概述和存储结构 xff08 一 xff09 文章目录 前言一 图的概述1 xff09 图的分类2 xff09 图的要素 二 图的存储结构三 邻接矩阵四 邻接表 前言 有一种说法是程序是由数据结构和算法组成的 xff0c 这很能体现出数据
  • 图解迪杰斯特拉(Dijkstra)最短路径算法

    往期文章目录 干货满满 xff01 最小生成树 Prim算法 最小生成树 Kruskal算法 目录 前言 一 最短路径的概念及应用 二 Dijkstra迪杰斯特拉 1 什么是Dijkstra 2 逻辑实现 总结 前言 无论是什么程序都要和数