【PAT甲级题解记录】1003 Emergency (25 分)

news/2024/4/19 3:18:28/文章来源:https://blog.csdn.net/weixin_46360993/article/details/129167079

【PAT甲级题解记录】1003 Emergency (25 分)

前言

Problem:1003 Emergency (25 分)

Tags:单源最短路径 dijkstra

Difficulty:剧情模式 想流点汗 想流点血 死而无憾

Address:1003 Emergency (25 分)

问题描述

  • 给定一个城市间构成的一个无向图,每个点上都有一个救援人手数量,一个救援队需要从点 C1C1C1 到点 C2C2C2 ,途经的城市中的救援人手求最短路径的数量以及满足路径最短的途经的最大人手数量和。

  • 简单来说,就是一个带权点的无向图,求其单源最短路径的数量以及最短路径情况下的最大路径点权和。

解题思路

  1. 对于单源最短路径(这道题也应该不会出现负边),一般我们最常用的就是dijkstra算法,但这里不单单是求最短路径,但是依旧可以用这个算法,算是dijkstra求最短路径的变题。最短路径我也总结了一个模板在这里:最短路径一般算法总结(板子),可以直接复制下来改。

  2. 在此基础上,为了求最短路径数量,我们加入了类似dp的思想:

    • cnt[i]cnt[i]cnt[i] 表示到 iii 点的最短路径数量。然后在dijkstra算法的每一次更新路径长度数组dist时更新每一个点的cnt值即可。

    • num[i]num[i]num[i] 表示当前最短路径下到 iii 点的最大救援人员,同样在更新最新dist时更新num值,但是不同的是这时候的更新时有条件的(肯定要人员更多才更新)。

    • 即分为俩种情况:

      • 搜索到相同路径长度的前节点时:

        cnt[i] = cnt[i_pre]+cnt[i]; 
        

        若当前方案救援人数更多时:

        num[i] = num[i_pre]+num_of_rescue[i];
        
      • 搜索到更短路径长度的前节点时:

        cnt[i] = cnt[i_pre]; 
        num[i] = num[i_pre]+num_of_rescue[i];
        

这道题在atcoder上也出现过,但那个版本更简单:https://atcoder.jp/contests/abc211/tasks/abc211_d

参考代码

#include<iostream>
#include<vector>using namespace std;
int N; // number of cities
int M; // number of roads
int C1, C2; // start, end
vector<int> teams(505, 0); // number of rescue teams in the i-th city
vector<int> dist(505, 0x3f3f3f3f); // 初始化为大值,表示无路径
vector<bool> in(505, false);
vector<vector<int> > MAP(505);
vector<int> cnt(505, 0);
vector<int> teams_sum(505, 0); // 按照当前最短路径,到某一点可遇到的救援队最多数量void init() {cin >> N >> M >> C1 >> C2;for (int i = 0; i < N; i++) {cin >> teams[i];}for (int i = 0; i < N; i++) {MAP[i].resize(N, 0x3f3f3f3f);}for (int i = 0; i < M; i++) {int c1, c2, L;cin >> c1 >> c2 >> L;MAP[c1][c2] = L;MAP[c2][c1] = L;}
}void dijkstra() {dist[C1] = 0; // 初始化dist数组,这样可以确保第一次循环可以顺利得出距离集合最短的路径,即起点本身teams_sum[C1] = teams[C1];cnt[C1] = 1;int times = N;while (times--) { // loop for N timesint min_dist = 0x3f3f3f3f;int min_city = -1;// find min_distfor (int i = 0; i < N; i++) {if (!in[i] && dist[i] < min_dist) {min_dist = dist[i];min_city = i;}}if (min_city == C2) break;in[min_city] = true;// update distfor (int i = 0; i < N; i++) {int new_dist_toi = dist[min_city] + MAP[min_city][i]; // 通过 min_city 到 i 的 最短路径int new_teams_num_toi = teams_sum[min_city] + teams[i];  // 通过 min_city 到 i 的 最大救援队数量if (!in[i] && new_dist_toi < dist[i]) {dist[i] = new_dist_toi;teams_sum[i] = new_teams_num_toi;cnt[i] = cnt[min_city];} else if (!in[i] && new_dist_toi == dist[i]) { // 注意一定要加 else,否则前一个 if 会影响该判断cnt[i] = cnt[min_city] + cnt[i];if (new_teams_num_toi > teams_sum[i]) {teams_sum[i] = new_teams_num_toi;}}}}
}void solution_1003() {init();dijkstra();cout << cnt[C2] << " " << teams_sum[C2] << endl;
}
int main() {solution_1003();return 0;
}

总结

没啥好说的算是比较基础的最短路径问题,但是要记住理解也需要花点功夫,毕竟再熟悉的算法隔一段时间后也可能会忘。

再把最短路径的板子放一遍:最短路径一般算法总结(板子)

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SCADA-1-组态前期需求调研篇

近期有朋友找到我&#xff0c;说scada组态系统开源的很少&#xff0c;不少开发者借此售卖这种软件&#xff0c;我回了句&#xff1a;这有什么难的&#xff0c;不就是拖拖拽拽&#xff0c;再绑定上数据源&#xff0c;实现动态效果嘛。。。&#xff08;先装了个X&#xff09;一、…

【C++】类和对象入门必知

面向过程和面向对象的初步认识类的引入类的定义类的访问限定符封装类的作用域类的实例化类对象模型this指针C语言和C实现Stack的对比面向过程和面向对象的初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解…

3717: yuyu学数数

描述yuyu开始学数数了&#xff0c;她要爸爸给他一些火柴棍&#xff0c;她要拼出很多数来。yuyu每次说要拼什么数字&#xff0c;爸爸就得想想要给她几根&#xff0c;好累啊&#xff0c;于是就只好写程序了。输入输入数据有多组&#xff0c;每组占一行&#xff0c;每行一个非负整…

版本控制软件SVN

SVN学习 1 版本控制软件定义及用途 版本控制软件是为适应软件配置管理的需要&#xff0c;控制软件的修改&#xff0c;减少混乱&#xff0c;提高软件生产效率&#xff0c;其是软件质量保证的重要环节软件配置管理是对软件修改进行标识、组织和控制的技术&#xff0c;用来协调和…

数据结构:循环队列的实现(leetcode622.设计循环队列)

目录 一.循环队列简单介绍 二.用静态数组实现循环队列 1.数组循环队列结构设计 2.数组循环队列的堆区内存申请接口 3.数据出队和入队的接口实现 4.其他操作接口 5.数组循环队列的实现代码总览 三.静态单向循环链表实现循环队列 1.链表循环队列的结构设计 2.创建静…

Linux服务:Nginx服务配置及相关模块

目录 一、Nginx配置文件 1、主配置文件解析 2、子配置文件启用 二、子配置文件使用 1、创建虚拟主机实验 2、基于端口虚拟主机实验 三、Nginx模块 1、access模块 2、自定义错误页面 3、状态页开启 一、Nginx配置文件 1、主配置文件解析 ①yum安装主配置文件位置&…

攻击者失手,自己杀死了僵尸网络 KmsdBot

此前&#xff0c;Akamai 的安全研究员披露了 KmsdBot 僵尸网络&#xff0c;该僵尸网络主要通过 SSH 爆破与弱口令进行传播。在对该僵尸网络的持续跟踪中&#xff0c;研究人员发现了一些有趣的事情。 C&C 控制 对恶意活动来说&#xff0c;最致命的就是夺取对 C&C 服务…

Anaconda环境配置

1.进入清华大学镜像网站Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror&#xff0c;下载稳定版Anaconda3-5.2.0&#xff0c;如下图。2.放到整理好的文件夹中&#xff0c;双击安装包进行安装。3.安装过程中需要改变的默认值如下&#xff…

【数据库】redis数据持久化

目录 数据持久化 一&#xff0c; RDB 1&#xff0c; 什么是RDB 2&#xff0c;持久化流程 3&#xff0c; 相关配置 案例演示&#xff1a; 4&#xff0c; 备份和恢复 1、备份 2、恢复 3&#xff0c;优势 4&#xff0c; 劣势 二&#xff0c;AOF 1&#xff0c;什么是A…

说说 React 中 fiber、DOM、ReactElement、实例对象之间的引用关系

原生组件 fiber 原生组件 fiber&#xff0c;指的就是 type 为 “span”、“div” 的 fiber。 1.fiber.stateNode 指向真实 DOM 节点&#xff1b;2.node["__reactFiber$" randomKey] 指向对应 fiber&#xff0c;使用随机数是防止和业务代码的属性名冲突&#xff0c;…

Scala模式匹配详解(第八章:基本语法、模式守卫、模式匹配类型)(尚硅谷笔记)

模式匹配第 8 章 模式匹配8.1 基本语法8.2 模式守卫8.3 模式匹配类型8.3.1 匹配常量8.3.2 匹配类型8.3.3 匹配数组8.3.4 匹配列表8.3.5 匹配元组8.3.6 匹配对象及样例类8.4 变量声明中的模式匹配8.5 for 表达式中的模式匹配8.6 偏函数中的模式匹配(了解)第 8 章 模式匹配 Scal…

论文解读 | [AAAI2020] 你所需要的是边界:走向任意形状的文本定位

目录 1、研究背景 2、研究的目的 3、方法论 3.1 Boundary Point Detection Network(BPDN) 3.2 Recognition Network 3.3 Loss Functions 4、实验及结果 论文连接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/6896 1、研究背景 最近&#xff0c;旨在…

深度解读 | 数据资产管理面临诸多挑战,做好这5个措施是关键

日前&#xff0c;大数据技术标准推进委员会&#xff08;中国通信标准化协会下&#xff08;CCSA&#xff09;的专业技术委员会&#xff0c;简称TC601&#xff09;发布《数据资产管理实践白皮书》&#xff08;6.0 版&#xff09;&#xff08;以下简称&#xff1a;报告&#xff09…

浏览器跨域问题

跨域问题什么是跨域问题如何解决跨域问题JSONPCORS方式解决跨域使用 Nginx 反向代理使用 WebSocket跨源请求是否能携带Cookie什么是跨域问题 跨域问题指的是不同站点之间&#xff0c;使用 ajax 无法相互调用的问题。跨域问题本质是浏览器的一种保护机制&#xff0c;它的初衷是为…

LQB01位操作说明

一个字节&#xff0c;包括了8位&#xff0c;可以对其中的8位的某一位进行读或者写&#xff1b; 比如char num12,如果用十六进制表示&#xff0c;就是0x0C&#xff0c;如果二进制表示&#xff0c;就是0000 1010 位操作函数&#xff0c;主要这里介绍&#xff0c;位读和位写0&am…

【消费战略方法论】认识消费者的恒常原理(一):消费者稳态平衡原理

“消费战略”是塔望咨询基于大量的战略与营销实践经验结合心理学、经济学、传播学等相关专业学科的知识应用进行提炼与创造形成的战略方法体系。消费战略强调以消费者为导向&#xff0c;进行企业、品牌战略、品牌营销的制订和落地&#xff0c;企业经营的每个环节和输出的每个动…

轻松搭建Redis缓存高可用集群

1. 安装单机Redis 安装步骤&#xff1a; 1.1 下载redis 官网下载3.0.0版本&#xff0c;之前几的版本不支持集群模式 下载地址&#xff1a;http://download.redis.io/releases/redis-3.0.0.tar.gz 1.2 首先需要安装gcc yum install gcc 1.3 创建目录 cd /usr/mkdir soft1.…

GitHub标星30K+的Java面试八股文长啥样?

2023年的互联网行业竞争越来越严峻&#xff0c;面试也是越来越难&#xff0c;一直以来我都想整理一套完美的面试宝典&#xff0c;奈何难抽出时间&#xff0c;这套1000道的Java面试手册我整理了整整1个月&#xff0c;上传到Git上目前star数达到了30K 一、32 道 MySQL 面试题 1&…

DACS: Domain Adaptation via Cross-domain Mixed Sampling 学习笔记

DACS介绍方法Naive MixingDACSClassMix![在这里插入图片描述](https://img-blog.csdnimg.cn/ca4f83a2711e49f3b754ca90d774cd50.png)算法流程实验结果反思介绍 近年来&#xff0c;基于卷积神经网络的语义分割模型在众多应用中表现出了显著的性能。然而当应用于新的领域时&…

乐友商城学习笔记(一)

SpringCloud 什么是SpringCloud 在SpringBoot基础上构建的微服务框架固定步骤 1.引入组件的启动器2.覆盖默认配置3.在引导类上添加相应的注解 eureka 注册中心&#xff0c;服务的注册与发现服务端 1.引入服务器启动器&#xff1a;eureka-server2.添加了配置 spring.applicati…