C++最短路问题基础算法模板

最短路问题(五个算法模板) 题目给定一个有向图,图中有 𝑛n 个点和 𝑚m 条边。图中可能存在重边和自环,所有边权均为正值。请你求出从 1 号点到 𝑛n 号点的最短距离。如果无法从 1 号点走到 𝑛n 号点,则输出 -1。 阅读详情

先上本篇博客的主要内容(图片有一处打错了应该是dijkstra)
在这里插入图片描述

朴素dijkstra算法

时间复杂度为O(n2),多用于不存在负权边的稠密图(指边数远大于节点数)中

int g[N][N], dis[N], n, m;//g[N][N]为邻接矩阵用于存储每条边,dis[N]存储某个点到1号点的最小距离, n为点数,m为边数
bool visit[N];//储存每个点的最短路是否确定

int dijkstra()
{
    memset(dis, 0x3f, sizeof(dis));
    dis[1] = 0;

    for(int i = 0; i < n - 1; i++)
    {
        int t = -1;//在未确定最短路的点中寻找距离一号店点最近的点
        for(int j = 1; j <= n; j ++)
        {
            if(!visit[j] && (t == -1 || dis[t] > dis[j]))
                t = j;
        }

        visit[t] = true;
        //用t更新其他点的距离
        for(int j = 1; j <= n; j++)
        {
            dis[j] = min(dis[j], dis[t] + g[t][j]);
        }
    }
    return dis[n];
}

堆优化版dijkstra算法

时间复杂度为(mlogn),多用于不存在负权边且为稀疏图(边数约等于节点数)中

typedef pair<int, int> P;
int h[N], ne[N], e[N], w[N], idx;//用邻接表来储存边
int n, m, dis[N];//储存所有点到一号点的距离
bool visit[N];//判断每个点的最短路是否确定

void add(int a, int b, int c)//将边添加到邻接表中
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

int dijkstra(void)
{
    memset(dis, 0x3f, sizeof(dis));
    dis[1] = 0;

    priority_queue<P, vector<P>, greater<P> > heap;
    heap.push({0, 1});//first储存距离, second储存编号
    
    while(!heap.empty())
    {
        P t = heap.top();
        heap.pop();

        int ver = t.second, distance = t.first;
        if(visit[ver]) continue;
        visit[ver] = true;

        for(int i = h[ver]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(dis[j] > distance + w[i])
            {
                dis[j] = distance + w[i];
                heap.push({dis[j], j});
            }
        }
    }
    return dis[n];
}

bellman_ford算法

时间复杂度为O(nm),用于存在负权边的最短路径,也可存在负权回路

int n, m;       // n表示点数,m表示边数
int dist[N];        // dist[x]存储1到x的最短路距离

struct Edge     // 边,a表示出点,b表示入点,w表示边的权重
{
    int a, b, w;
}edges[M];

// 求1到n的最短路距离,如果无法从1走到n,则返回-1。
int bellman_ford()
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;

    // 如果第n次迭代仍然会松弛三角不等式,就说明存在一条长度是n+1的最短路径,由抽屉原理,路径中至少存在两个相同的点,说明图中存在负权回路。
    for (int i = 0; i < n; i ++ )
    {
        for (int j = 0; j < m; j ++ )
        {
            int a = edges[j].a, b = edges[j].b, w = edges[j].w;
            if (dist[b] > dist[a] + w)
                dist[b] = dist[a] + w;
        }
    }

    if (dist[n] > 0x3f3f3f3f / 2) return -1;
    return dist[n];
}

spfa算法

最常用的最短路算法之一,时间复杂度为O(m),最坏情况下为O(nm)

int h[N], w[N], ne[N], e[N], idx;//用邻接表储存边
int n, m, dis[N];//储存每个点到1号点距离
bool visit[N];//判断每个点是否在队列中

void add(int a, int b, int c)
{
    e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

int spfa(void)
{
    memset(dis, 0x3f, sizeof(dis));
    dis[1] = 0;

    queue<int> heap;
    heap.push(1);
    while(!heap.empty())
    {
        int t = heap.front();
        heap.pop();

        visit[t] = false;
        for(int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            if(dis[j] > dis[t] + w[i])
            {
                dis[j] = dis[t] + w[i];
                if(!visit[j])
                {
                    heap.push(j);
                    visit[j] = true;
                }
            }
        }
    }
    return dis[n];
}

flody算法

时间复杂度为O(n3),用于求多源最短路问题

int dis[N][N], n, m, k;

int floyd()
{
    for(int k = 1; k <= n; k++)
    {
        for(int i = 1; i <= n; i++)
        {
            for(int j = 1; j <= n; j++)
            {
                dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
            }
        }
    }
}

本文章素材全部来自于AcWing的yxc大佬,AcWing网站
个人学习使用

4个【最短路算法】零基础C++ 4 个常考最短路算法,通俗讲解,一遍懂 阅读详情

相关推荐

从0开始详解 Johnson 全源最短路(P5905 【模板】Johnson 全源最短路)

问题引入:(【模板】Johnson 全源最短路 - 洛谷) ps:(如果不想 情景带入 请直接转跳到Johnson算法详解) 目录 问题引入:(【模板】Johnson 全源最短路 - 洛谷) 题目描述 输出格式 说明/提示 【数据范围】 常用最短路时间复杂度: Johnson 全源最短路 详解 第一个问题:如何可以把负权都转变成正权 题目描述 给定一个包含 n 个结点和 m 条带权边的有向图,求所有点对间的最短路径长度,一条路径的长度定义为这条路径上所有边的权值和。 ..

m0_60593173的博客 2230

C++图论-四种最短路径算法模板

文章讲解C++图论-最短路问题中的Floyed,Dijkstra,Bellman-Ford以及SPFA算法

2401_86567574的博客 333

C++ 最短路(distra) 洛谷

2018 年 7 月 19 日,某位同学在一题里非常熟练地使用了一个广为人知的算法求最短路。然后呢?100→60;Ag→Cu;最终,他因此没能与理想的大学达成契约。小 F 衷心祝愿大家不再重蹈覆辙。

2401_86043888的博客 1261

C++ 最短路(spfa) 洛谷

我是源点,你是终点。我们之间有负权环。——小明。

2401_86043888的博客 452

最短路模板(详细注解)

可以做刷题的模板哦!!!可以好好理解哦

Node框架之NestJS入门学习

文章主要分为三部分:1 NestJS 与Egg对比2 NestJS 基础知识介绍3 使用NestJS快速搭建应用,实现CURD操作e-link文档Egg官网NestJS 官网NestJS中文文档(非官方)

十九万里的博客 4742

P1744 采购特价商品(洛谷)

中山路上有 n(n≤100)家店,每家店的坐标均在 −10000 至 10000 之间。若有通路,则表示可以从一家店走到另一家店,通路的距离为两点间的直线距离。现在爱与愁大神要找出从一家店到另一家店之间的最短距离。接下来 m 行:每行描述一条通路,由两个整数 i 和 j 组成,表示第 i 家店和第 j 家店之间有通路。仅一行:一个实数(保留两位小数),表示从 s 到 t 的最短路径长度。接下来 n 行:每行两个整数 x 和 y,描述了一家店的坐标。接下来一行:两个整数 s 和 t,分别表示原点和目标店。

2401_86025291的博客 349

ESP-IDF下载配合MQTT协议接入云平台实例

通过ESP-IDF下载环境搭建,结合MQTT协议实现设备与云平台通信,详解从配置到连接的完整流程,助力物联网应用开发。重点涵盖espidf下载和MQTT集成关键步骤。

weixin_28913879的博客 454

最短路算法——模板

单源最短路 权值都为正数 Dijkstra (迪杰斯特拉) 朴素 复杂度:O(n2)O(n^2)O(n2) 堆优化 复杂度:O(mlogn)O(mlogn)O(mlogn) 权值都为负数 Bellman-Ford 复杂度:O(nm)O(nm)O(nm) Bellman-Ford 复杂度:一般:O(m)O(m)O(m),最坏O(nm)O(nm)O(nm) 多源最短路 Floyd 复杂度:O(n3)O(n^3)O(n3) ...

青丝蛊のblog 207

HBuilderx 坑 之前没问题 改了几行代码 小程序上传报分包大小超过限制

Error: 分包大小超过限制,main package source size 4199KB exceed max limit 2MB [20221213 10:08:06][wx432abdb518bdc1eb]下面的我提示是都没超过2M,却提示我超过限制,代码改了不到20行吧,之前是正常上传的.....,比如这类,要压缩的,前提是没压缩过的,但是我肯定提交的时候是压缩的,没勾选此项的要注意,如果本文解决了你的困扰 来波666不为过吧!

爱就码上行动,奔赴热爱,追光而行。愿你带着从容与热爱,拥抱每一天的惊喜与美好 5220

国产数据库安装部署说明

国产数据库安装部署说明

weixin_38203586的博客 910

蓝桥杯考常考点模板

一年来,笔者学到的所有的算法模板。

Ten_years_star的博客 801

保姆级教程:用Python+OpenCV搞定Orbbec Gemini深度与彩色流对齐(附完整代码)

本文提供了一份详细的Orbbec Gemini深度与彩色流对齐教程,涵盖从环境配置到完整代码实现的每一步。通过解析深度流对齐原理,对比不同对齐模式,并提供工业级应用中的问题排查方法,帮助开发者快速掌握Orbbec Gemini相机的使用技巧。文章还包含进阶应用如点云生成与三维重建的实战代码。

weixin_29090917的博客 470

linux添加R环境变量path,centos添加PATH环境变量

showSetPwdDialog--自定义对话框样式: 布局: layout dialog_set_pwd.xml & ...C&plus;&plus;学习笔记30&colon;模板与型式参数化转型操作 接受目标型式作为模板参数 Programmer *p = dynamic_cast(e) 模板工作原理 使用templatePOJ 2457 Part Acqui...

weixin_39542889的博客 335

详细解释SigLIP的原理,为什么有些多模态模型喜欢用他?怎么应用于机器人控制呢

详细解释SigLIP的原理,为什么有些多模态模型喜欢用他?怎么应用于机器人控制呢。

具身机器人和通用AI 1230

端到端自动驾驶:特斯拉FSD Beta技术拆解

端到端自动驾驶:特斯拉FSD Beta技术拆解 ,人工智能,计算机视觉,大模型,AI,这篇文章围绕特斯拉FSD Beta的端到端自动驾驶技术展开,先介绍端到端自动驾驶的定义、与传统方案的区别及FSD Beta的特点,再阐述其硬件基础、技术架构,解析关键技术,还涉及训练数据与标注、安全与冗余设计、实际应用场景与挑战以及技术迭代与更新等内容,展现了该技术的多方面情况。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 18万+

C++:【算法】最短路问题

在图论问题中,最短路算法是一个典型且很常用的算法。面对不同的情况,要选择不同的算法。本文。下面给出一个思维导图:算法并不难,问题的关键在于建图,这个需要做题积累经验。下面只给出算法的基本实现,还需各位同学多多做题。

qq_73176808的博客 1411

地平线旭日X3 安装xfce桌面+VNC查看USB摄像头

VNC是Virtual Network Computing的缩写,它是一种使用RFB(Remote Frame Buffer)协议的用于控制远程电脑的图形桌面分享系统。xfce桌面相比于GNOME桌面更加轻量,占用的资源更少,在没有GPU的设备上也可以运行(旭日的Desktop版本从外观上好像就是xfce桌面,具体没有尝试)。可以使用专用的VNC客户端连接到开发板,例如vnc viewer。板子默认带有openssh-server,因此,WiFi热点连接成功后,就可以使用ssh登录开发板了。

bingdund的博客 509

约会怎么走到目的地最近呢?一文讲清所有最短路算法问题

约会怎么走到目的地最近呢?一文讲清所有最短路算法问题

congfen214的博客 2640

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

领略算法真谛:单源最短路问题

嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的passion。准备好和我一起冲进代码的奇幻宇宙了吗?Let's go!什么是单源最短路?假设一个图中的两个顶点vi,vj,从vi到vj路径上所经过的权值之后就称为带权路径长度。但vi到vj的路径有很多条,将带权路径长度最短的那条路径就称为最短路径。• 单源最短路,即图中一个顶点到其它各顶点的最短路径。

yuanManGan的博客 952

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

《算法磨剑:用 C++ 思考的艺术》:从此多源最短路不慌了!模板 + 4 题,C++ 代码直接用

本文为《算法磨剑:用 C++ 思考的艺术》专栏多源最短路专题,详解 Floyd 算法的动态规划本质、空间优化技巧及适用场景,搭配 4 道实战题(洛谷 B3647 模板题、P2910 应用题、P1119 场景题、P6175 最小环问题),附完整 C++ 代码,助力理解多源最短路的核心逻辑与实战应用。

2403_88424194的博客 1204

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

SPFA最短路算法

前言 算法用途 算法原理 算法结果 算法实现 正确性证明 例题 CPP源代码前言咳,又是一个新的博客。。。最近几天高产似母猪哈今天要讲的是SPFA算法。欢迎大家来看。。。算法用途这个算法,如其名:Shortest Path Fastest Algorithm,就是求最短路的算法。和Dijkstra一样,这是一个单源最短路算法。算法原理这个算法因为与贝尔曼福德(Bellman-Ford)算法比较相似,...

不写博客 5589

算法基础-多源最短路

摘要:本文介绍了多源最短路问题及其Floyd算法实现。Floyd算法通过动态规划思想,以O(n³)时间复杂度计算图中所有点对的最短路径,适用于带权有向/无向图(允许负权边但不含负环)。文章详细讲解了Floyd的状态表示(f[k][i][j])、状态转移方程(分是否经过k点两种情况)和空间优化技巧,并提供了四个典型例题的解法:1)模板题直接应用Floyd;2)寻宝问题累加路径和;3)灾后重建问题按时间动态更新;4)无向图最小环问题利用Floyd特性求解。每个问题均附完整代码实现,展现了Floyd算法的灵活应用

2401_87986548的博客 799

【模板】单源最短路径(标准版)堆优化dijkstra

第一行为三个正整数 �,�,�n,m,s。第二行起 �m 行,每行三个非负整数 ��,��,��ui​,vi​,wi​,表示从 ��ui​ 到 ��vi​ 有一条权值为 ��wi​ 的有向边。给定一个 �n 个点,�m 条有向边的带非负权图,请你计算从 �s 出发,到每个点的距离。输出一行 �n 个空格分隔的非负整数,表示 �s 到每个点的距离。2018 年 7 月 19 日,某位同学在。本题数据可能会持续更新,但不会重测,望周知。最终,他因此没能与理想的大学达成契约。数据保证你能从 �s 出发到任意点。

捉只树袋熊的博客 332

C++图论基础单源最短路-常规版dijkstra算法/堆优化版dijkstra算法/bellman-ford 算法/spfa 算法流食般投喂

spfa算法其实就是用队列优化的Bellman-Ford算法,因为我们知道,Bellman-Ford算法中,在执行单次操作时,并不是所有边都进行了有效的松弛操作,只有经松弛操作之后的节点的出边才可能会继续有松弛操作,所以,我们用了队列来优化,队列里面存着经过松弛操作后待处理节点,从队列里面拿出来时,这个节点在呆在队列的过程中,别的节点进行松弛操作,连带着他已经经过一次或者多次,已经充分进行了松弛操作,所以,出队列时,我们拿到的就是最新最好的结果,这样我们也不要有。bool st[N]。

江屿风的博客 9540

常见最短路模板

在 C++ 里有一些最短路的问题,题目需要你求出图中一点到另一点的最短距离,在这个时候,我们通常会使用最常见的 3 种方法。

AllenAC的博客 832
上一篇: C++计算n阶行列式
下一篇: 蓝桥杯C++ B组---带分数
zhbbbb!
博客等级 码龄7年 43粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值