PTA天梯 L2-001 紧急救援

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:
输入第一行给出 4 4 4个正整数 N 、 M 、 S 、 D N、M、S、D NMSD,其中 N ( 2 ≤ N ≤ 500 ) N(2≤N≤500) N2N500是城市的个数,顺便假设城市的编号为 0 ( N − 1 ) 0 ~ (N−1) 0 (N1) M M M是快速道路的条数, S S S是出发地的城市编号, D D D是目的地的城市编号。

第二行给出 N N N个正整数,其中第 i i i个数是第 i i i个城市的救援队的数目,数字间以空格分隔。随后的 M M M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过 500 500 500。输入保证救援可行且最优解唯一。

输出格式:
第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从 S S S D D D的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2

输出样例:

2 60
0 1 3

首先明确:本题考察图论最短路问题,由于边权全为正数,且为稀疏图,故使用堆优化djikstra。

要求的量为:最短路径的个数,在所有最短路中能够召集的救援人员的数量,且要求记录下能够召集最多人员的路径。

接下来开始考虑问题:

  • 如何存图? 可以使用邻接表或者vector,在此题解中使用了vector来存图
  • 如何记录最短路的个数? 这里使用一个数组,假如将其命名为roadCnt[],那么roadCnt[i]存储的是从起点到i点的最短路的数量,之后在djikstra的过程中,我们在发现有更短的路径的时候就更新掉roadCnt[],在发现有相同等级的最短路的时候就让roadCnt[]加上另一个路径引过来的roadCnt[]
  • 如何记录在所有最短路径中能够召集的救援人员的数量? 同样使用一个数组,将其命名为personNow[],使personNow[i]代表从起点到 i i i点的最短路中能够召集的最多的救援人员数量,同时我们还要有读入每个城市救援人员数量的数组person[],在起点的时候要把personNow[s]初始化为person[s],之后在dijkstra的过程中,每次发现一个最短路,就使personNow[next] = personNow[pre] + person[next],注意其必须满足在最短路径中。之后在发现一个距离和当前最短路相等的新的最短路的时候,我么进行判断,如果新的最短路能够召集的人员更多的话,就将personNow[]更新。
  • 如何记录路径? 此乃老生常谈,仅需要一个pre[]数组,pre[i] = j就代表j的上一个点是i,最终我们输出路径的时候只需要从终点开始,顺藤摸瓜,反着输出所有点即可。注意需要对pre[]数组进行初始化。

注意题目已经规定好了起点和终点,别再傻傻的从0开始搜搜到n点。

那么所有问题已经明了了,就要进行代码实现:

#include<iostream>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
#define PII pair<int,int>
const int N = 510;struct Edge {int to, w;
};
vector<Edge>edges[N];		//二维结构体vector存图int dis[N];					//记录从起点到当前点的距离
bool st[N];					//标记当前点有没有搜过
int roadCnt[N];				//记录最短路数量
int personNow[N];			//记录最大救援人员召集数量
int pre[N];					//记录路径
int person[N];				//记录每个城市的救援人员数量int n, m, s, d;				void dijkstra() {			//dijkstra函数memset(pre, -1, sizeof pre);		//首先对pre[]数组进行初始化memset(dis, 0x3f, sizeof dis);	dis[s] = 0;					//题目已经规定好了起点roadCnt[s] = 1;				//路径数起码为1personNow[s] = person[s];	//初始化person[起点]priority_queue< PII, vector<PII>, greater<PII> >heap;	//定义小根堆heap.push({ 0,s });	//first:距离 	second:当前点while (heap.size()) {auto t = heap.top();heap.pop();int ver = t.second, distance = t.first;if (st[ver])continue;	//如果已经搜过了,就直接跳else st[ver] = 1;for (auto p : edges[ver]) {	//遍历边int to = p.to;	//指向的下一个点int w = p.w;	//边权if (dis[to] > dis[ver] + w) {		//如果边更短dis[to] = dis[ver] + w;			//更新边heap.push({ dis[to],to });		//压入堆roadCnt[to] = roadCnt[ver];		//更新最短路数量pre[to] = ver;					//记录路径,personNow[to] = personNow[ver] + person[to];//}else if (dis[to] == dis[ver] + w) {	//如果是相同距离最短路if (personNow[to] < personNow[ver] + person[to]) {	//如果这条最短路能够得到更多的人pre[to] = ver;									//更新路径和最大人员数量personNow[to] = personNow[ver] + person[to];}roadCnt[to] += roadCnt[ver];	//加上}}}
}int main() {cin >> n >> m >> s >> d;for (int i = 0; i < n; i++) {cin >> person[i];}while (m--) {int u, v, w;cin >> u >> v >> w;edges[u].push_back({ v,w });		//无向图,存两条边edges[v].push_back({ u,w });}dijkstra();cout << roadCnt[d] << " " << personNow[d];	//输出最短路数量和最大人员数量puts("");vector<int>path;		//存答案路径,以倒着输出path.push_back(d);d = pre[d];while (d != -1) {path.push_back(d);d = pre[d];}for (int i = path.size() - 1; i >= 0; i--) {if (i != 0)cout << path[i] << " ";else cout << path[i];}return 0;
}

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

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

相关文章

组合逻辑电路(一)(加法器)

目录 组合逻辑电路的特点及功能描述 采用SSI的组合逻辑电路的分析与设计 采用SSI的组合逻辑电路的分析 采用SII的组合逻辑电路的设计 例 例 例 常用的MSI组合逻辑电路 半加器 全加器 加法器 串行进位加法器 例 例 超前进位加法器 组合逻辑电路的特点及功能描述 小规模集成…

原生微信小程序电影购票+后台管理系统[含文档]

简介 正文获取联系方式&#xff01;❤❤❤关于JAVA/小程序/安卓/PHP/Python/C#/ASP.NET/大数据/爬虫/数据可视化都可推荐选题和提供专业的指导和支持。 【毕设源码推荐项目】基于原生微信小程序电影购票系统 适用于计算机类毕业设计&#xff0c;本系统功能完整&#xff0c;适合…

TypeScript新手指南:何时使用.ts,何时转向.tsx?

在TypeScript中&#xff0c;.ts和.tsx文件扩展名代表两种不同的文件类型&#xff1a; .ts&#xff1a;这是一个标准的TypeScript文件&#xff0c;它可以包含TypeScript代码&#xff0c;该代码最终会被编译成JavaScript。.ts文件通常不包含JSX代码&#xff0c;JSX是一种JavaScri…

基础小白快速入门并行计算------>我们为什么要学习并行计算

什么是并行计算&#xff1f; 随着计算机的不断发展&#xff0c;我们处理的数据不断变多&#xff0c;需要更大得到处理能力、我们希望计算机有着更大更强壮的计算能力&#xff0c;由于cpu的运行能力有限&#xff0c;我们便想到了将多个cpu进行串联计算问题&#xff0c;这也就是我…

AtCoder Beginner Contest 343(A,B,C,D,E,F)

比赛链接 CE是暴力&#xff0c;D是数据结构题&#xff0c;F是线段树。这场的E比较有意思&#xff0c;其他的感觉有点水。 A - Wrong Answer 题意&#xff1a; 给你两个数 A , B A,B A,B ( 0 ≤ A , B ≤ 9 ) (0\le A,B\le 9) (0≤A,B≤9)&#xff0c;返回一个个位数&#…

Java类加载流程?

Java类加载过程是指将.class文件中的字节码数据加载到内存中&#xff0c;并生成对应的Class对象的过程。Java类加载器&#xff08;ClassLoader&#xff09;负责执行这个任务。Java类加载过程主要包括以下几个步骤&#xff1a; 加载&#xff08;Loading&#xff09;&#xff1a;…

Codeforces Round 883 (Div. 3)(集训队加训1)

A.如果钉子与地面距离大于绳子的长度就必须剪 #include<bits/stdc.h> #define eps 1e-5 #define INF 1e9 using namespace std; typedef long long ll; const int N 2e6 9; int a[N],b[N],cl[N]; void Lan(){int n;cin>>n;for(int i1;i<n;i){cin>>a[i]…

如何提高项目成功率?分享20 种项目管理工具、技术和软件

本文将分享20种项目管理常用的工具、技术和软件&#xff0c;比如项目管理软件 PingCode、Worktile、Redmine、Jira、SAP、PrimaveraSystems等&#xff1b;项目计划阶段工具和技术WBS、甘特图、PERT图、风险评估矩阵等等。 项目管理是确保项目成功交付的关键&#xff0c;它涉及到…

Java学习笔记009——局部内部类(需配合接口使用)

局部内部类&#xff08;Local Inner Classes&#xff09;在Java中是一种非常有用的特性&#xff0c;尽管它们的使用场景相对较少。局部内部类定义在一个方法、构造器或代码块中&#xff0c;而不是在类的顶层。这样的设计有几个主要的意义&#xff1a; 1. 代码组织&#xff1a;…

【产品文档分类及撰写路径】

一、产品文档的分类 产品文档根据所处阶段和面相对象的差异大致可以分为三类&#xff1a; 商业需求文档 (BRD)&#xff1a;商业需求文档是面向公司高层和项目组&#xff0c;目的是为了获得资金、资源支持。市场需求文档 (MRD)&#xff1a;市场需求文档是面向运营和市场销售人员…

【重要!!退税!退税!】一年一度个人所得税综合年度汇算开始了!

目录标题 如何退税&#xff1f;2023年度个人所得税综合所得汇算清缴操作指南汇算准备标准申报 退税骗局&#xff1f;1.“您有一笔退税待领取”骗局2.“专业人员帮你多退税”骗局3.“诱导填报虚假个税信息”骗局4.“税务稽查人员联系你”骗局 如何退税&#xff1f; 2023年度个人…

2024年腾讯云优惠政策_腾讯云服务器特价购买活动入口

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

网络编程作业day7

作业项目&#xff1a;基于UDP的聊天室 服务器代码&#xff1a; #include <myhead.h>//定义客户信息结构体 typedef struct magtye {char type; //消息类型char name[100]; //客户姓名char text[1024]; //客户发送聊天信息 }msg_t;//定义结构体存储…

类的关系 继承(Inheritance)、聚合(Aggregation)和关联(Association)

前言 在面向对象编程中&#xff0c;类之间的关系主要有以下几种&#xff1a;继承&#xff08;Inheritance&#xff09;、聚合&#xff08;Aggregation&#xff09;和关联&#xff08;Association&#xff09;。每种关系在对象的创建和销毁时&#xff0c;构造函数和析构函数的调…

刷题日记:面试经典 150 题 DAY5

刷题日记&#xff1a;面试经典 150 题 DAY4 125. 验证回文串28. 找出字符串中第一个匹配项的下标151. 反转字符串中的单词6. Z 字形变换68. 文本左右对齐 125. 验证回文串 原题链接 125. 验证回文串 双指针&#xff0c;一前一后&#xff0c;遇到非数字字母跳过即可 class So…

腾讯云哪款服务器最便宜划算?2024腾讯云服务器优惠价格表

腾讯云优惠活动2024新春采购节活动上线&#xff0c;云服务器价格已经出来了&#xff0c;云服务器61元一年起&#xff0c;配置和价格基本上和上个月没什么变化&#xff0c;但是新增了8888元代金券和会员续费优惠&#xff0c;腾讯云百科txybk.com整理腾讯云最新优惠活动云服务器配…

TCP三次握手四次挥手

目录 TCP报文 ☞ 标志位 TCP状态变迁图&#xff1a; 三次握手 为什么要三次握手&#xff1f; 客户端与服务端接口状态 客户端&#xff1a; 服务端&#xff1a; 第一次握手&#xff1a; 第二次握手&#xff1a; 第三次握手&#xff1a; 四次挥手&#xff1a; 四次挥…

火爆全网,软件测试数据库常用 SQL 语句总结,你要的我都有......

前言 直接上干货 数据定义语言(DDL) 主要负责数据库、数据表、视图、键、索引等结构化的操作 常用的语句有&#xff1a;CREATE DATABASE、CREATE TABLE、ALTER TABLE等 字段的常用约束有&#xff1a;PRIMARY KEY、FOREIGN KEY、NOT NULL、UNIQUE、AUTO_INCREMENT、DEFAULT 常…

onnx模型优化利器onnxoptimizer、onnxsim

ONNX性能优化和调试技巧 - 知乎ONNX模型是一种跨平台、跨框架的模型表示格式,允许用户在不同的深度学习框架之间共享模型和数据,从而加速模型开发和部署。然而,在实际应用中,我们通常需要对ONNX模型进行性能优化和调试,以确保其在不同硬件和…https://zhuanlan.zhihu.com/…

PTA L2-011 玩转二叉树

给定一棵二叉树的中序遍历和前序遍历&#xff0c;请你先将树做个镜面反转&#xff0c;再输出反转后的层序遍历的序列。所谓镜面反转&#xff0c;是指将所有非叶结点的左右孩子对换。这里假设键值都是互不相等的正整数。 输入格式&#xff1a; 输入第一行给出一个正整数N&…