图论------Bellman-Ford算法求单源最短路径的优化

news2024/11/13 9:12:38

目录

前情回顾:

画图分析:

具体代码:


前情回顾:

        大家是否还记得我们之前讲过的Bellman-Ford算法,如果忘记的话可以点击链接去复习一下:图论------贝尔曼-福德(Bellman-Ford)算法-CSDN博客

        当时我们是通过画图打表格来讲解的,但是最后代码输出的结果和我给的数据略有差距,这是因为我们是想要将这个数据当作无向图的数据来处理的,但是当时我给到的代码是用来处理有向图的,那我们该怎么办,将u,v,w数据扩展两倍反向再次储存一次边吗?实际上没必要,我们要做的就是多添加两行代码。

画图分析:

        首先大家请看下图:

        

        我们能看到 图中存在 2 4 3这一条数据,那么代码运行时一定会有:

if( dic[ 4 ] > dic[ 2 ] + 3) 这一条,显然不成立,因为 dic[ 2 ] = 8,所以无法成立,无法优化1 到 4 的值,然后我们再来看 1 到 2 能不能优化,发现 dic[ 2 ] = dic[ 1 ] + 8无法优化,如果通过 2 4 3这条边能不能优化1 到 2的值呢?我们发现好像不可以哎,因为在之前的代码中的视角,这是个有向图,可惜,如果是无向图就好了,我们会想该怎么调整代码让代码将数据当作无向图处理呢?比如

2 4 3 也可以当作 4 2 3 处理。

        当然是可以的,接下来我要讲的东西有点抽象:

        大家想一想,在之前代码的认知中w[ i ]是不是有向的,那是因为u[ i ] -->v[ i ]这条边我们只使用了一次,以 2 4 3 这条数据为例:

        第一次使用是 判断 是否 dic[ 4 ] > dic[ 2 ] + 3 意思是 1 到 4 能不能 通过 1 -> 2 -> 4来更新,那么如何第二次将2 -> 4 这条边当作 4 -> 2 来使用呢?就是if(dic[ 2 ] > dic[ 4 ] +3),意思是是否能通过 1 -> 4 -> 2来更新 1到 2的值,如果每条边都那么处理两次,相当于将该图当作无向图处理,因为每条边都 正反 处理了两次。

具体代码:

        

#include<stdio.h>
int main(void)
{
    int u[10], v[10], w[10];
    int n, m, inf = 99999999;
    int dic[10] = { 0 };

    scanf("%d%d", &n, &m);
    for (int i = 1; i <= m; i++)
        scanf("%d%d%d", &u[i], &v[i], &w[i]);

    for (int i = 2; i <= n; i++)
        dic[i] = inf;

    for (int k = 1; k <= n - 1; k++)
        for (int i = 1; i <= m; i++)
            if (dic[v[i]] > dic[u[i]] + w[i])
                dic[v[i]] = dic[u[i]] + w[i];
            else if (dic[u[i]] > dic[v[i]] + w[i])
                dic[u[i]] = dic[v[i]] + w[i];

    for (int i = 1; i <= n; i++)
        printf("%d ", dic[i]);
}

        那么如果所有的路径都已经优化完成了怎么样退出循环呢?

#include<stdio.h>

int main(void)

{

    int u[10], v[10], w[10];

    int n, m, inf = 99999999;

    int dic[10] = { 0 };

    scanf("%d%d", &n, &m);

    for (int i = 1; i <= m; i++)

        scanf("%d%d%d", &u[i], &v[i], &w[i]);

    for (int i = 2; i <= n; i++)

        dic[i] = inf;

    for (int k = 1; k <= n - 1; k++)

    {

        int flag = 0;//检查是否提前退出循环。

        for (int i = 1; i <= m; i++)

            if (dic[v[i]] > dic[u[i]] + w[i])

            {

                dic[v[i]] = dic[u[i]] + w[i]; flag = 1;

            }

            else if (dic[u[i]] > dic[v[i]] + w[i])

            {

                dic[u[i]] = dic[v[i]] + w[i]; flag = 1;

            }

        if (flag == 1)

            break;

    }

    for (int i = 1; i <= n; i++)

        printf("%d ", dic[i]);

}

当然是 for (int i = 1; i <= m; i++)循环发现一轮没有路径优化时退出啦。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2038475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C# NX二次开发-曲线延长和缩短

图示&#xff1a;延长曲线 代码&#xff1a;正值延长负值缩短 var cl workPart.Features.CreateCurvelengthBuilder(null);cl.CurvelengthData.ExtensionMethod NXOpen.GeometricUtilities.ExtensionMethod.Incremental;cl.CurvelengthData.ExtensionSide NXOpen.GeometricU…

C++ 内存布局 - Part1: typeid, typeinfo及单继承

1. typeinfo定义 typeinfo中存储的是关于类型的信息&#xff0c;可以通过typeid操作符获取&#xff0c;对于没有虚函数的场景&#xff0c;typeid返回的是编译器静态类型信息&#xff0c;对于一个基类类型指针&#xff0c;哪怕其真实指向是个派生类&#xff0c;如果没有虚函数&…

求解答matlab,具体问题如下:

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

数据埋点系列 6|数据驱动决策的实际应用:从理论到实践

在前面的系列文章中&#xff0c;我们深入探讨了数据驱动决策的各个方面。现在&#xff0c;是时候将这些知识付诸实践了。本文将通过一个虚构但贴近现实的案例&#xff0c;展示如何在一个组织中实施数据驱动决策&#xff0c;同时我们将讨论在这个过程中可能遇到的挑战和解决方案…

HAProxy 全解析:驾驭网络负载均衡与高可用的强大引擎

一、什么是HAproxy HAProxy是一个免费、开源的高性能TCP/HTTP负载均衡器和代理服务器软件&#xff0c;主要用于实现以下功能 一、负载均衡 多种负载均衡算法支持&#xff1a; 轮询&#xff08;Round Robin&#xff09;&#xff1a;它依次将请求均匀分配到后端的各个服务器。例…

Linux进程--进程的调度和切换

文章目录 一、进程优先级1.优先级的概念2.优先级的实现 二、进程的调度和切换1.Linux的进程调度概念2.进程的切换1.硬件上下文2.Linux调度实现 一、进程优先级 1.优先级的概念 进程要访问某种资源&#xff0c;要进行进程上的排队&#xff0c;来确认享受资源的前后顺序。 在x…

基于phpstudy对cmseasy5.5进行漏洞复现

目录&#xff1a; 漏洞复现的cmseasy5.5百度网盘链接 安装cmseasy&#xff1a; 1.在phpstudy上安装cmseasy 2.设置mysql密码为phpstudy内置mysql的密码并检查安装环境 3.安装后查看mysql内cmseasy是否有内容 获取用户名和密码过程&#xff1a; 1.查看源码发现有个remotelo…

字符串 - 反转字符串 II

541. 反转字符串 II 方法一&#xff1a;模拟&#xff08;reverse方法分开写&#xff09; /*** param {string} s* param {number} k* return {string}*/ var reverseStr function(s, k) {const n s.length;const arr Array.from(s);for (let i 0; i < n; i 2 * k) {re…

uniCloud服务空间选择支付宝云后,使用uni-file-picker扩展组件不回显的bug处理

问题概述 开发uniappunicloud项目&#xff0c;DCloud官方给出了很多好用的扩展组件&#xff0c;其中uni-file-picker图片上传组件非常好用&#xff0c;不用编写代码&#xff0c;即可将本地图片上传到云存储中。 原来云开发一直选择的是阿里云服务空间&#xff0c;官方一直推支…

汇编:基本指令及格式

汇编不区分大小写 寄存器只有名字&#xff0c;没有地址 Nop 栈先初始化 import引用外部函数 export外部可用声明 函数传参&#xff08;默认先使用寄存器R0~R3&#xff09;: 1.四个以内的参数使用 R0~R3 2.超过四个的参数使用栈传递 返回值: 返回值存放在R0中 立即数&…

还不会部署本地AI大模型?LangChat带你快速接入并部署本地大模型

LangChat是Java生态下企业级AIGC项目解决方案&#xff0c;在RBAC权限体系的基础上&#xff0c;集成AIGC大模型功能&#xff0c;帮助企业快速定制知识库、企业机器人。 产品官网&#xff1a;LangChat – LangChat LangChat源码&#xff1a;https://github.com/tycoding/langcha…

【机器学习】神经网络通过梯度下降学习的步骤以及前向传播的详细步骤

引言 神经网络中的梯度下降是一种优化算法&#xff0c;用于训练网络&#xff0c;即调整网络的权重和偏置&#xff0c;以最小化损失函数 文章目录 引言一、神经网络通过梯度下降学习的步骤1.1 初始化网络参数1.2 前向传播&#xff08;Forward Propagation&#xff09;1.3 计算损…

优化大量数据导出到Excel的内存消耗(二):如果数据超出Excel单表上限,则进行分表

优化前&#xff1a;优化大量数据导出到Excel的内存消耗_大文件异步导出 内存占用高-CSDN博客 写Excel文件报错&#xff1a;Invalid row number (1048576) outside allowable range (0..1048575) 写入Excel时遇到IllegalArgumentException&#xff0c;原因是超出允许的最大行数…

哪些岗位在拿着年薪百万?

​根据脉脉数据研究院 2020 年 8 月 2 日最新发布的《中国高端人才透视2020》(以下简称“报告”)&#xff0c;高端人才占比的最多的行业&#xff0c;其实不是互联网。 报告显示&#xff0c;以高薪金领人才相比于该行业的整体人才数量的占比来计算&#xff0c;排名前三的是金融、…

【分割大模型】SAM2(Segment Anything2)新的分割一切大模型(原理+安装+代码)

文章目录 前言1.特点2.结构3.应用场景 一、原理1.1 引言1.2 任务&#xff1a;可提示的视觉分割1.3 模型1.4 数据引擎 与 SA-V数据集 二、安装与使用 项目地址&#xff1a;https://github.com/facebookresearch/segment-anything-2 前言 Segment Anything Model 2&#xff08;S…

使用SSL认证访问操作手册

完整版 【金山文档 | WPS云文档】 使用SSL认证访问操作手册 https://kdocs.cn/l/cuxGfHD17eEw

vue2.0和vue3.0区别

vue2.0和vue3.0区别 双向数据绑定的原理改变&#xff1a;‌ Vue2使用Object.defineProperty对数据进行劫持&#xff0c;‌结合发布订阅模式实现双向数据绑定&#xff0c;‌而Vue3则采用了ES6的Proxy API对数据进行代理&#xff0c;‌提供了更多的拦截操作&#xff0c;‌能够监…

KBL406-ASEMI、AI智能专用整流桥KBL406

编辑&#xff1a;ll KBL406-ASEMI、AI智能专用整流桥KBL406 型号&#xff1a;KBL406 品牌&#xff1a;ASEMI 封装&#xff1a;KBL-4 批号&#xff1a;2024 现货&#xff1a;50000 正向电流&#xff08;Id&#xff09;&#xff1a;4A 反向耐压&#xff08;VRRM&#xff…

【智能流体力学】ANSYS Fluent流体仿真基础深度学习驱动的前期准备:CAX计算机辅助集成技术

目录 一、CAX计算机辅助集成技术二、计算机辅助工程(CAE)三、SCDM (Species Concentration Display Model) 显示和分析物质浓度分布的模型1. **SCDM概述**2. **主要功能**3. **功能特点**4. **使用步骤**5. **应用实例**6. **优点与限制**四、行业应用五、Fluent 软件功能1. …

net.sf.jsqlparser.statement.select.SelectItem

今天一启动项目&#xff0c;出现了这个错误&#xff0c;仔细想了想&#xff0c;应该是昨天合并代码&#xff0c;导致的mybatis-plus版本冲突&#xff0c;以及分页PageHelper版本不兼容 可以看见这个我是最下边的 Caused by 报错信息&#xff0c;这个地方提示我 net .s…