【天梯赛】L2-001紧急救援(用迪杰斯特拉找出权重和最小的最短路径)

news2025/3/15 16:31:16

 解题反思

尝试DFS:开始使用DFS来遍历求解,但 DFS 存在大量重复计算,像同一节点会被多次访问并重复计算路径信息,导致时间复杂度高,部分测试点未通过

改用迪杰斯特拉:为了求解,设置了很多的辅助数组,对于他们本身的初始化、以及对于起始点S的初始化赋值容易出错,需要小心

迪杰斯特拉相当于是用一次过程找出了所有点的信息,最后只需要按要求输出D对应的信息即可

迪杰斯特拉算法,通过储存每个点的信息,为后续的其他点的信息求取打下了坚实基础,用空间换取了大量时间

题面

L2-001 紧急救援 - 团体程序设计天梯赛-练习集

代码实现 

// 定义常量 mx 为整型的最大值,用于表示无穷大
#define mx INT_MAX
#include<bits/stdc++.h>
using namespace std;

int main()
{
    // N 表示城市数量,M 表示道路数量,S 表示起点城市,D 表示终点城市
    int N,M,S,D;
    // 从标准输入读取 N、M、S、D 的值
    cin>>N>>M>>S>>D;
    // 创建一个大小为 N 的向量 rescue,用于存储每个城市的救援人员数量
    vector<int>rescue(N);
    // 循环 N 次,依次读取每个城市的救援人员数量并存入 rescue 向量
    for(int i=0; i<N; i++) cin>>rescue[i];
    // 创建一个 N * N 的二维向量 graph,初始值都为 mx(无穷大),用于表示城市间的距离
    vector<vector<int>>graph(N, vector<int>(N, mx));
    // 循环 M 次,读取每条道路的信息
    for(int i=0; i<M; i++)
    {
        // a 和 b 表示道路连接的两个城市,len 表示道路的长度
        int a, b, len;
        // 从标准输入读取 a、b、len 的值
        cin>>a>>b>>len;
        // 无向图,两个城市间的距离是对称的,更新 graph 矩阵
        graph[a][b] = len;
        graph[b][a] = len;
    }
    //

    // 存储从起点到每个城市的最短距离,初始值为 mx(无穷大)
    vector<int>dist_(N, mx);
    // 存储从起点到每个城市能召集到的最大救援人员数量,初始值为 0
    vector<int>re_rescue(N, 0);
    // 存储从起点到每个城市的最短路径数量,初始值为 0
    vector<int>path_cnt(N, 0);
    // 标记每个城市是否已经确定最短路径,初始值为 false
    vector<bool>visited(N, false);
    // 存储每个城市在最短路径中的前驱城市,初始值为 -1
    vector<int>pre(N, -1);
    //

    // 起点到自身的距离为 0
    dist_[S] = 0;
    // 起点的前驱城市是自身
    pre[S] = S;
    // 起点到自身的最短路径数量为 1
    path_cnt[S] = 1;
    // 起点能召集到的救援人员数量就是起点城市本身的救援人员数量
    re_rescue[S] = rescue[S];
    // 迪杰斯特拉算法核心循环,循环 N 次
    for(int i=0; i<N; i++)
    {
        // 用于记录当前未确定最短路径的城市中距离起点最近的城市编号,初始值为 -1
        int u = -1;
        // 记录当前找到的最小距离,初始值为 mx(无穷大)
        int min_len = mx;
        // 遍历所有城市
        for(int j=0; j<N; j++)
        {
            // 如果该城市未确定最短路径且距离起点的距离小于当前最小距离
            if(!visited[j] && dist_[j] < min_len)
            {
                // 更新最小距离
                min_len = dist_[j];
                // 更新最近城市编号
                u = j;
            }
        }
        // 如果没有找到符合条件的城市,说明所有可达城市都已确定最短路径,退出循环
        if(u == -1) break;
        // 标记该城市已确定最短路径
        visited[u] = true;
        // 遍历所有城市,更新与 u 相邻城市的信息
        for(int j=0; j<N; j++)
        {
            // 如果 u 到 j 有道路且通过 u 到 j 的距离比当前记录的距离更短
            if(graph[u][j] != mx && dist_[j] > dist_[u] + graph[u][j])
            {
                // 更新 j 到起点的最短距离
                dist_[j] = dist_[u] + graph[u][j];
                // 更新 j 的前驱城市为 u
                pre[j] = u;
                // 更新 j 的最短路径数量为 u 的最短路径数量
                path_cnt[j] = path_cnt[u];
                // 更新 j 能召集到的最大救援人员数量
                re_rescue[j] = re_rescue[u] + rescue[j];
            }
            // 如果 u 到 j 有道路且通过 u 到 j 的距离与当前记录的距离相等
            else if(graph[u][j] != mx && dist_[j] == dist_[u] + graph[u][j])
            {
                // 累加 j 的最短路径数量
                path_cnt[j] += path_cnt[u];
                // 如果通过 u 到 j 能召集到更多的救援人员
                if(re_rescue[j] < re_rescue[u] + rescue[j])//比较救援人数大小
                {
                    // 更新 j 的前驱城市为 u
                    pre[j] = u;
                    // 更新 j 能召集到的最大救援人员数量
                    re_rescue[j] = re_rescue[u] + rescue[j];
                }
            }
        }
    }
    // 输出从起点到终点的最短路径数量和能召集到的最大救援人员数量
    cout<<path_cnt[D]<<" "<<re_rescue[D]<<endl;
    // 回溯找路径
    // 创建一个栈 help 用于存储路径
    stack<int>help;
    // 从终点开始回溯
    int cur = D;
    // 将终点压入栈中
    help.push(cur);
    // 当当前城市的前驱城市不是自身时,继续回溯
    while(pre[cur] != cur)
    {
        // 更新当前城市为其前驱城市
        cur = pre[cur];
        // 将当前城市压入栈中
        help.push(cur);        
    }
    // 依次弹出栈中的元素并输出路径
    while(!help.empty())
    {
        // 获取栈顶元素
        cur = help.top();
        // 弹出栈顶元素
        help.pop();
        // 输出当前城市编号
        cout<<cur;
        // 如果栈不为空,输出空格分隔
        if(help.empty()) break;
        cout<<" ";
    }
    // 换行
    cout<<endl;
    return 0;     
}

~希望对你有启发!~

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

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

相关文章

PortSwigger——WebSockets vulnerabilities

文章目录 一、WebSockets二、Lab: Manipulating WebSocket messages to exploit vulnerabilities三、Lab: Manipulating the WebSocket handshake to exploit vulnerabilities四、Using cross-site WebSockets to exploit vulnerabilities4.1 跨站WebSocket劫持&#xff08;cro…

八、OSG学习笔记-

前一章节&#xff1a; 七、OSG学习笔记-碰撞检测-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145558132?spm1001.2014.3001.5501 一、了解OSG图元加载显示流程 本章节代码&#xff1a; OsgStudy/wids CuiQingCheng/OsgStudy - 码云 - 开源中国https:…

自己动手实现一个简单的Linux AI Agent

大模型带我们来到了自然语言人机交互的时代 1、安装本地大模型进行推理 下载地址&#xff1a; https://ollama.com/download 部署本地deepseek和嵌入模型 ollama run deepseek-r1:7b2、制定Linux操作接口指令规范 3、编写大模型对话工具 #!/usr/bin/python3 #coding: utf-8…

常见的数据仓库有哪些?

数据仓库(Data Warehouse,简称数仓)是企业用于存储、管理和分析大量数据的重要工具,其核心目标是通过整合和处理数据,为决策提供高质量、一致性和可信度的数据支持。在构建和使用数仓时,选择合适的工具和技术至关重要。以下是常见的数仓工具及其特点的详细介绍: 1. Hiv…

LSTM 学习笔记 之pytorch调包每个参数的解释

0、 LSTM 原理 整理优秀的文章 LSTM入门例子&#xff1a;根据前9年的数据预测后3年的客流&#xff08;PyTorch实现&#xff09; [干货]深入浅出LSTM及其Python代码实现 整理视频 李毅宏手撕LSTM [双语字幕]吴恩达深度学习deeplearning.ai 1 Pytorch 代码 这里直接调用了nn.l…

【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA

【EXCEL】【VBA】处理GI Log获得Surf格式的CONTOUR DATA data source1: BH coordination tabledata source2:BH layer tableprocess 1:Collect BH List To Layer Tableprocess 2:match Reduced Level from "Layer"+"BH"data source1: BH coordination…

国产编辑器EverEdit - 光标位置跳转

1 光标位置跳转 1.1 应用场景 某些场景下&#xff0c;用户从当前编辑位置跳转到别的位置查阅信息&#xff0c;如果要快速跳转回之前编辑位置&#xff0c;则可以使用光标跳转相关功能。 1.2 使用方法 1.2.1 上一个编辑位置 跳转到上一个编辑位置&#xff0c;即文本修改过的位…

cv2.Sobel

1. Sobel 算子简介 Sobel 算子是一种 边缘检测算子&#xff0c;通过对图像做梯度计算&#xff0c;可以突出边缘。 Sobel X 方向卷积核&#xff1a; 用于计算 水平方向&#xff08;x 方向&#xff09; 的梯度。 2. 输入图像示例 假设我们有一个 55 的灰度图像&#xff0c;像素…

鸿蒙HarmonyOS NEXT开发:优化用户界面性能——组件复用(@Reusable装饰器)

文章目录 一、概述二、原理介绍三、使用规则四、复用类型详解1、标准型2、有限变化型2.1、类型1和类型2布局不同&#xff0c;业务逻辑不同2.2、类型1和类型2布局不同&#xff0c;但是很多业务逻辑公用 3、组合型4、全局型5、嵌套型 一、概述 组件复用是优化用户界面性能&#…

Windows中使用Docker安装Anythingllm,基于deepseek构建自己的本地知识库问答大模型,可局域网内多用户访问、离线运行

文章目录 Windows中使用Docker安装Anythingllm&#xff0c;基于deepseek构建自己的知识库问答大模型1. 安装 Docker Desktop2. 使用Docker拉取Anythingllm镜像2. 设置 STORAGE_LOCATION 路径3. 创建存储目录和 .env 文件.env 文件的作用关键配置项 4. 运行 Docker 命令docker r…

[SAP ABAP] OO ALV报表练习1

销售订单明细查询报表 业务目的&#xff1a;根据选择屏幕的筛选条件&#xff0c;使用 ALV 报表&#xff0c;显示销售订单详情 效果展示 用户的输入条件界面 用户的查询结果界面 涉及的主要功能点&#xff1a; 1.当在销售订单明细查询页面取不到任何数据时&#xff0c;在选择…

数据库高安全—数据保护:数据动态脱敏

书接上文数据库高安全—审计追踪&#xff1a;传统审计&统一审计&#xff0c;从传统审计和统一审计两方面对高斯数据库的审计追踪技术进行解读&#xff0c;本篇将从数据动态脱敏方面对高斯数据库的数据保护技术进行解读。 5.1 数据动态脱敏 数据脱敏&#xff0c;顾名思义就…

Datawhale 数学建模导论二 2025年2月

第6章 数据处理与拟合模型 本章主要涉及到的知识点有&#xff1a; 数据与大数据Python数据预处理常见的统计分析模型随机过程与随机模拟数据可视化 本章内容涉及到基础的概率论与数理统计理论&#xff0c;如果对这部分内容不熟悉&#xff0c;可以参考相关概率论与数理统计的…

记录 | WPF基础学习MVVM例子讲解1

目录 前言一、NotificationObject与数据属性创建个类&#xff0c;声明NotificationObject 二、DelegateCommand与命令属性三、View与ViewModel的交互&#xff08;难点&#xff09;在ViewModel文件下创建MainWindowViewModel数据和方法绑定资源指定 代码下载四、优势体现代码下载…

PyTorch 中 `torch.cuda.amp` 相关警告的解决方法

在最近的写代码过程中&#xff0c;遇到了两个与 PyTorch 的混合精度训练相关的警告信息。这里随手记录一下。 警告内容 警告 1: torch.cuda.amp.autocast FutureWarning: torch.cuda.amp.autocast(args...) is deprecated. Please use torch.amp.autocast(cuda, args...) i…

实验7 路由器之间IPsec VPN配置

实验7 路由器之间IPsec VPN配置 1.实验目的 通过在两台路由器之间配置IPsec VPN连接&#xff0c;掌握IPsec VPN配置方法&#xff0c;加深对IPsec协议的理解。 2.实验内容 &#xff08;1&#xff09;按照实验拓扑搭建实验环境。 &#xff08;2&#xff09;在路由器R1和R4配置IP…

小白零基础如何搭建CNN

1.卷积层 在PyTorch中针对卷积操作的对象和使用的场景不同&#xff0c;如有1维卷积、2维卷积、 3维卷积与转置卷积&#xff08;可以简单理解为卷积操作的逆操作&#xff09;&#xff0c;但它们的使用方法比较相似&#xff0c;都可以从torch.nn模块中调用&#xff0c;需要调用的…

【Java八股文】01-Java基础面试篇

【Java八股文】01-Java基础面试篇 概念Java特点Java为什么跨平台JVM、JDK、JRE关系 面向对象什么是面向对象&#xff0c;什么是封装继承多态&#xff1f;多态体现的方面面向对象设计原则重载重写的区别抽象类和实体类区别Java抽象类和接口的区别抽象类可以被实例化吗 深拷贝浅拷…

k8s部署logstash

1. 编写logstash.yaml配置文件 --- apiVersion: v1 kind: Service metadata:name: logstash spec:type: ClusterIPclusterIP: Noneports:- name: logstash-tcpport: 5000targetPort: 5000- name: logstash-beatsport: 5044targetPort: 5044- name: logstash-apiport: 9600targ…

Arcgis/GeoScene API for JavaScript 三维场景底图网格设为透明

项目场景&#xff1a; 有时候加载的地图服务白色区域会露底&#xff0c;导致在三维场景时&#xff0c;露出了三维网格&#xff0c;影响效果&#xff0c;自此&#xff0c;我们需要将三维场景的底图设为白色或透明。 问题描述 如图所示&#xff1a; 解决方案&#xff1a; 提示…