卡码网KamaCoder 94. 城市间货物运输 I

news2025/1/18 21:20:56

题目来源:94. 城市间货物运输 I

C++题解1(来源代码随想录):Bellman_ford 

本题是经典的带负权值的单源最短路问题,此时就轮到Bellman_ford登场了。Bellman_ford算法的核心思想是 对所有边进行松弛n-1次操作(n为节点数量),从而求得目标最短路

对所有边松弛一次,相当于计算 起点到达 与起点一条边相连的节点 的最短距离,这里 说的是 一条边相连的节点。

需要对所有边松弛几次才能得到 起点(节点1) 到终点(节点6)的最短距离呢

节点数量为n,那么起点到终点,最多是 n-1 条边相连。

#include <iostream>
#include <vector>
#include <list>
#include <climits>
using namespace std;

int main() {
    int n, m, p1, p2, val;
    cin >> n >> m;

    vector<vector<int>> grid;

    // 将所有边保存起来
    for(int i = 0; i < m; i++){
        cin >> p1 >> p2 >> val;
        // p1 指向 p2,权值为 val
        grid.push_back({p1, p2, val});

    }
    int start = 1;  // 起点
    int end = n;    // 终点

    vector<int> minDist(n + 1 , INT_MAX);
    minDist[start] = 0;
    for (int i = 1; i < n; i++) { // 对所有边 松弛 n-1 次
        for (vector<int> &side : grid) { // 每一次松弛,都是对所有边进行松弛
            int from = side[0]; // 边的出发点
            int to = side[1]; // 边的到达点
            int price = side[2]; // 边的权值
            // 松弛操作 
            // minDist[from] != INT_MAX 防止从未计算过的节点出发
            if (minDist[from] != INT_MAX && minDist[to] > minDist[from] + price) { 
                minDist[to] = minDist[from] + price;  
            }
        }
    }
    if (minDist[end] == INT_MAX) cout << "unconnected" << endl; // 不能到达终点
    else cout << minDist[end] << endl; // 到达终点最短路径

}

C++题解2(来源代码随想录):SPFA

对 上一次松弛的时候更新过的节点作为出发节点所连接的边 进行松弛。用队列来记录。

在加入队列的过程可以有一个优化,用visited数组记录已经在队列里的元素,已经在队列的元素不用重复加入

 基于队列优化的算法,要比bellman_ford 算法 减少很多无用的松弛情况,特别是对于边数众多的大图 优化效果明显。

每次都要知道 一个节点作为出发点连接了哪些节点。如果想方便知道这些数据,就需要使用邻接表来存储这个图

#include <iostream>
#include <vector>
#include <queue>
#include <list>
#include <climits>
using namespace std;

struct Edge { //邻接表
    int to;  // 链接的节点
    int val; // 边的权重

    Edge(int t, int w): to(t), val(w) {}  // 构造函数
};


int main() {
    int n, m, p1, p2, val;
    cin >> n >> m;

    vector<list<Edge>> grid(n + 1); 

    vector<bool> isInQueue(n + 1); // 加入优化,已经在队里里的元素不用重复添加

    // 将所有边保存起来
    for(int i = 0; i < m; i++){
        cin >> p1 >> p2 >> val;
        // p1 指向 p2,权值为 val
        grid[p1].push_back(Edge(p2, val));
    }
    int start = 1;  // 起点
    int end = n;    // 终点

    vector<int> minDist(n + 1 , INT_MAX);
    minDist[start] = 0;

    queue<int> que;
    que.push(start); 

    while (!que.empty()) {

        int node = que.front(); que.pop();
        isInQueue[node] = false; // 从队列里取出的时候,要取消标记,我们只保证已经在队列里的元素不用重复加入
        for (Edge edge : grid[node]) {
            int from = node;
            int to = edge.to;
            int value = edge.val;
            if (minDist[to] > minDist[from] + value) { // 开始松弛
                minDist[to] = minDist[from] + value; 
                if (isInQueue[to] == false) { // 已经在队列里的元素不用重复添加
                    que.push(to);
                    isInQueue[to] = true;
                }
            }
        }

    }
    if (minDist[end] == INT_MAX) cout << "unconnected" << endl; // 不能到达终点
    else cout << minDist[end] << endl; // 到达终点最短路径
}

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

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

相关文章

【 ACM独立出版】第二届通信网络与机器学习国际学术会议(CNML 2024,10月25-27)

官方信息 会议官网&#xff1a;www.cn-ml.org The 2nd International Conference on Communication Networks and Machine Learningwww.cn-ml.org 时间地点&#xff1a;2024年10月25-27日 | 中国-河南-郑州 截稿时间&#xff1a;2024年10日19日 &#xff08;多轮截稿&#x…

51单片机的晾衣架控制系统【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块温湿度传感器光照传感器步进电机按键、LED、蜂鸣器等模块构成。适用于智能晾衣架等相似项目。 可实现功能: 1、LCD1602实时显示温湿度、光照强度和手动/自动信息 2、温湿度传感器DHT11采集温湿度信息 3、光照传感…

【数据结构与算法初阶】顺序表(上)

什么语言实现不重要&#xff0c;理解了思路就行&#xff0c;本篇使用C语言实现 一.顺序表含义(重要) 首先&#xff0c;顺序表属于线性表中的一中&#xff0c;线性表可以用多种方式实现&#xff0c;顺序表只是其中的一种 --------- 线性表是啥呢&#xff0c;通俗的说&#xff0…

lego-loam imageProjection.cpp源码注释(一)

一、主函数 int main(int argc, char** argv){ros::init(argc, argv, "lego_loam");ImageProjection IP;ROS_INFO("\033[1;32m---->\033[0m Image Projection Started.");ros::spin();return 0; }主函数很简单&#xff0c;常规ros初始化ros::init&…

程序员35岁丢了工作,应该怎么活?

35岁对很多程序员来说是个敏感的年龄段。在这个阶段&#xff0c;许多程序员已经有了丰富的工作经验和较高的薪水&#xff0c;但同时也面临着职场上不可忽视的年龄压力。尤其在一些技术密集型的公司&#xff0c;35岁之后的程序员可能被认为“年纪大了”&#xff0c;不再是招聘市…

【C语言】动态内存管理及相关笔试题

文章目录 一、为什么有动态内存分配二、malloc和free1.malloc函数的使用2.free函数的使用 三、calloc和realloc1.calloc函数的使用2.realloc函数的使用 四、常见动态内存分配的错误五、动态内存经典笔试题题1题2题3 六、总结C/C中程序内存区域划分 一、为什么有动态内存分配 我…

Struct Streaming

spark进行实时数据流计算时有两个工具 Spark Streaming:编写rdd代码处理数据流,可以解决非结构化的流式数据 Structured Streaming:编写df代码处理数据流,可以解决结构化和半结构化的流式数据 实时计算 实时计算&#xff0c;通常也称为“实时流计算”、“流式计算” 流数据处…

面腾讯后台开发,二面挂掉了,,,

随着各厂秋招的开启&#xff0c;收到面试邀请的同学也越来越多。在当年和我一起找实习的同学里面&#xff0c;有实力较强的同学收到了腾讯后台开发的校招面试邀请。但面试不止是实力的竞争&#xff0c;也有很重要的运气的因素。 虽然我的同学在腾讯后台开发的二面中挂掉了&…

Mybatis中的映射文件编写原则

先来回顾一下&#xff0c;在Java项目中如何使用Mybatis执行SQL语句&#xff1a; 添加依赖&#xff1a;在项目中添加 MyBatis 和数据库驱动的依赖。配置 MyBatis&#xff1a;创建 MyBatis 的配置文件&#xff0c;配置数据源和 Mapper 映射。创建 POJO 类&#xff1a;定义与数据…

拒绝飞单,微信监控轻松搞定!

微信作为广泛使用的社交工具&#xff0c;其安全性和监控问题受到了广泛关注。对于企业来说&#xff0c;确保客户资源的安全和防止员工“飞单”是重要的管理挑战。以下是一些有效的方法和工具&#xff0c;可以帮助企业提高微信的安全性&#xff0c;防止飞单&#xff0c;从而保护…

LLM - 配置 ModelScope SWIFT 测试 Qwen2-VL 模型推理(Infer) 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/142827217 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 SWIFT …

QT文件操作【记事本】

mainwindow.h核心函数 QFileDialog::getOpenFileName()QFileDialog::getSaveFileName() #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include<QFileDialog> #include<QMessageBox> #include<QDebug> #include<QFile> #…

Apache Kafka的生态

Kafka 生态系统 微信公众号&#xff1a;阿俊的学习记录空间 小红书&#xff1a;ArnoZhang wordpress&#xff1a;arnozhang1994 博客园&#xff1a;arnozhang CSDN&#xff1a;ArnoZhang1994 以下是与 Kafka 集成的工具列表&#xff0c;涵盖了不同领域的工具和扩展。这些…

Jmeter如何进行多服务器远程测试?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 JMeter是Apache软件基金会的开源项目&#xff0c;主要来做功能和性能测试&#xff0c;用Java编写。 我们一般都会用JMeter在本地进行测试&#xff0c;但是受到单…

鱼跃医疗荣获深交所信息披露工作“A”级评价

2024年10月11日&#xff0c;深圳证券交易所&#xff08;以下简称“深交所”&#xff09;发布了《关于深市上市公司2023-2024年度信息披露评价结果的通报》&#xff0c;鱼跃医疗&#xff08;002223.SZ&#xff09;凭借在信息披露质量、投资者关系管理等各方面的优异表现&#xf…

总结拓展十四:批次管理(1)

1、批次的概念 批次是指生产或采购过程中&#xff0c;为了区分不同供应商之间相同产品间的微小区别而进行的管理方式。它通常用于确保产品质量的一致性和可追溯性。批次的概念可以应用于多个领域&#xff0c;包括生产、采购、物流、销售等。 2、批次管理的概念 批次管理是指对…

SIC MOS的保护方式

SIC MOS与IGBT短路保护有所不同的原因&#xff1a; 由于SIC MOS芯片尺寸较小(散热能力较差&#xff0c;在短路情况下&#xff0c;浪涌电流会产生大量的热量)&#xff0c;SIC MOS的浪涌能力低于IGBT。SiC MOSFET 和 IGBT 的输出特性不同&#xff0c;在正常导 通状态期间&#x…

【vue3】弹幕效果实现

本次弹幕基于vue3-danmaku组件实现。 弹幕效果 1.安装插件 npm install vue3-danmaku --save 2.基础使用方法 <template><vue-danmaku v-model:danmus"danmus" loop style"height:100px; width:300px;"></vue-danmaku> </templat…

发布自己的python包

文章目录 概要模块和包发布自己的package创建目录结构发布 概要 提示&#xff1a;这里可以添加技术概要 例如&#xff1a; openAI 的 GPT 大模型的发展历程。 模块和包 在Python中&#xff0c;程序的划分可以分为三个层次&#xff1a;脚本、模块和包 script&#xff1a;独…

【人工智能】探索最强AI工具:实际应用与影响

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;AI工具已经深入到人们日常生活和工作的方方面面。这些工具不仅提高了生产力&#xff0c;还改变了我们解决问题和处理信息的方式。在中文互联网和国际市场中&#xff0c;众多AI工具已成为人们工作、学习、创作…