紧急救援(pta团体天梯题)dijkstra算法灵活运用c++

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

输入格式:

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

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

输出格式:

第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到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

 该题很明显的dijkstra算法不过在最短路的基础上加上了要获得最多救援队,就要求我们对于dijkstra算法来灵活运用了,这里对于dijkstra算法就不多说了,不懂得可以看我之前的文章,这里主要基于dijkstra算法来给思路

相对于dijkstra算法求最短路径长度,可以知道我们需要多设置的变量,这题要求我们(1)求出给出起始点到终点的最短路径数目,以及(2)其中最大救援队的数目,最后再(3)输出最短路径经过哪些点

这下知道我们需要基于原始算法多想的点了,一个一个突破

对于(1):我们可以设置一个数组cnt来存储到该点的最短路径数目,每个点的最短路径数目怎么算呢?这题就可以分成两种情况,一是找到新的最短路径的时候,此时这个点的最短路路径数等于上一个点的最短路径数(因为此时只能从固定上一个点走过来的)二是找到最短距离相同但是路径不一样的时候,该点的路径数即加上新路径的上一个点的最短路径的和

对于(2)设置一个数组sum存储路径点的救援队数目,并且跟着路径更新

对于(3)设置一个pre数组,存储每个点最短路中前一个点是谁,以方便后面输出

可能说着不容易理解,我们直接进入代码,我也标注在代码里面了

代码如下

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N=510;
int d[N][N],w[N];//d存储每个点到每个点的距离,w存储每个城市的救援队数目
int dist[N],cnt[N],sum[N],pre[N];//cnt存储当前点最短路径数,sum为当前点总共最大救援队数目//pre存储最短路的前驱节点
bool st[N];
int n,m,s,e;
void dijkstra()
{memset(dist,0x3f,sizeof dist);dist[s]=0,cnt[s]=1,sum[s]=w[s];for(int i=0;i<n;i++){int t=-1;for(int j=0;j<n;j++){if(!st[j]&&(t==-1||dist[j]<dist[t])) t=j;}st[t]=true;for(int j=0;j<n;j++){if(dist[t]+d[t][j]<dist[j])//假如该点找到更短路径{dist[j]=dist[t]+d[t][j];//更新路径长度cnt[j]=cnt[t];//更新后该点的最短路径数等于上一个点的最短路径数sum[j]=sum[t]+w[j];//更新救援队数目pre[j]=t;//更新每个点最短路走过来的上一个点}else if(dist[t]+d[t][j]==dist[j])//假如找到不同路径但是路径距离一样{cnt[j]+=cnt[t];//该点加上新路径上一个点的最短路径数if(sum[t]+w[j]>sum[j])//找更多救援队数量的路径并记录{sum[j]=sum[t]+w[j];pre[j]=t;//更新最短路中最多救援队的路径走过来的上一个点} }}}
}
int main()
{memset(d,0x3f,sizeof d);cin>>n>>m>>s>>e;for(int i=0;i<n;i++) cin>>w[i];while(m--){int a,b,c;cin>>a>>b>>c;d[a][b]=d[b][a]=min(d[a][b],c);}dijkstra();vector<int> a;//建立一个容器把需要点最短路径放进去for(int i=e;i!=s;i=pre[i]) a.push_back(i);cout<<cnt[e]<<" "<<sum[e]<<endl;cout<<s;for(int i=a.size()-1;i>=0;i--) cout<<" "<<a[i];return 0;
}

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

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

相关文章

【Git篇】复习git

文章目录 &#x1f354;什么是git⭐git和svn的区别 &#x1f354;搭建本地仓库&#x1f354;克隆远程仓库&#x1f6f8;git常用命令 &#x1f354;什么是git Git是一种分布式版本控制系统&#xff0c;它可以追踪文件的变化、协调多人在同一个项目上的工作、恢复文件的旧版本等…

在宝塔面板中,为自己的云服务器安装SSL证书,为所搭建的网站启用https(主要部分攻略)

前提条件 My HTTP website is running Nginx on Debian 10&#xff08;或者11&#xff09; 时间&#xff1a;2024-3-28 16:25:52 你的网站部署在Debain 10&#xff08;或者11&#xff09;的 Nginx上 安装单域名证书&#xff08;默认&#xff09;&#xff08;非泛域名&#xf…

了解 C++ 中的三元运算符

在 C 编程中&#xff0c;三元运算符是一种特殊的运算符&#xff0c;也被称为条件运算符。它由 “?” 和 “:” 组成&#xff0c;通常用于简单的条件判断和返回不同的值。本文将介绍三元运算符的基本语法以及如何在 C 中使用它进行条件判断。 三元运算符的语法 三元运算符的基本…

现在做抖音小店都需要准备什么?需要什么条件?门槛很高吗?

大家好&#xff0c;我是电商花花。 自从抖音小店这个项目做的人越来越多&#xff0c;很多人都想赶上抖音小店这个红利项目&#xff0c;但是很多新手在刚开始接触这个项目时候因为不懂&#xff0c;开始频频踩雷&#xff0c;不得不关店重新再来。 我们今天汇总了一下抖音小店的…

低代码开发:助力企业实现数字化运维体系搭建

随着数字化浪潮的推进&#xff0c;企业对于快速响应市场变化、提升运营效率的需求日益迫切。在这一背景下&#xff0c;低代码开发&#xff08;Low-Code Development&#xff09;作为一种新兴的软件开发方法&#xff0c;正逐渐受到企业的青睐。低代码开发不仅简化了开发过程&…

OSCP靶场--image

OSCP靶场–image 考点(CVE-2023-34152 suid strace提权) 1.nmap扫描 ## ┌──(root㉿kali)-[~/Desktop] └─# nmap -Pn -sC -sV 192.168.178.178 --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-27 23:43 EDT Nmap scan report for 192.168.178.17…

时间同步-chrony

场景&#xff1a;内网主机需要搭建 NTP 服务&#xff0c;设置一台主机作为服务端&#xff0c;其他主机作为客户端。 1 、服务端 1.1 、检查服务是否存在 如果服务存在可以跳过1.2、1.3&#xff0c;直接进行配置文件修改 systemctl status chronyd1.2、上传安装包 如果不存…

Java基础知识总结(24)

limit 分页 原理&#xff1a; /* limit m,n ​ m 表示从下标为 m 的记录开始查询&#xff0c;第一条记录下标为 0&#xff0c;n 表示取出 n 条出来&#xff0c;如 果从 m 开始不够 n 条了&#xff0c;就有几条取几条。m(page-1)*n&#xff0c;&#xff08;page 页码&#xff…

hive授予指定用户特定权限及beeline使用

背景&#xff1a;因业务需要&#xff0c;需要使用beeline对hive数据进行查询&#xff0c;但是又不希望该用户可以查询所有的数据&#xff0c;希望有一个新用户bb给他指定的库表权限。 解决方案&#xff1a; 1.赋权语句&#xff0c;使用hive管理员用户在终端输入hive进入命令控…

如何在群晖NAS搭建bitwarden密码管理软件并实现无公网IP远程访问

前言 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊如何在群晖NAS搭建bitwarden密码管理软件并实现无公网IP远程访问&#xff0c;希望大家能觉得实用&#xff01; 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01;&#x1f496;&am…

降分违规?90%新手会遇到的抖音小店运营问题!解决方法快围观!

哈喽~我是电商月月 今天我们聊聊新手开抖音小店会遇到的问题以及解决方法 为了完整性我们从头到尾分析&#xff0c;根据情况不同可自行翻阅 一&#xff0c;入驻和运营时的操作问题 1.营业执照的办理&#xff0c;选择&#xff0c;填写 营业执照的办理可以去当地工商局办理&…

nginx截取url后面的id比较大小

##这里下面的代码是截取url后面的文章id&#xff0c;然后比较小于200000的话&#xff0c;跳转到指定的页面 ##注意 http://xxx.com/index.html 需要换成自己的页面 #set $article_id ""; #set $history_flag 1; #set $min_article_id 10; # …

迭代器模式(统一对集合的访问方式)

目录 前言 UML plantuml 类图 实战代码 Iterator ArrayList Client 自定义迭代器 TreeNode TreeUtils Client 前言 在实际开发过程中&#xff0c;常用各种集合来存储业务数据并处理&#xff0c;比如使用 List&#xff0c;Map&#xff0c;Set 等等集合来存储业务数…

揭秘!抖音严打AI网红骗局,维护虚拟世界秩序!

近年来&#xff0c;AI网红在社交媒体平台上的兴起引发了不少争议。为了规范虚拟人物的内容创作&#xff0c;抖音平台决定对AI网红乱象进行严厉打击&#xff0c;并推出了一系列措施。 AI-321 | 专注于AI工具分享的网站 AI工具集 | 人工智能工具箱 | 全球顶尖AI工具软件推荐与分…

Linux:环境变量的特性及获取

目录 一、环境变量基本概念 1.1命令行参数 1.2常见环境变量 二、环境变量相关指令 创建本地变量 三、环境变量通常是具有全局属性的 一、环境变量基本概念 环境变量(environment variables)不是一个而是一堆&#xff0c;彼此之间其实没有关系。本质上是为了解决不同场景下…

如何用智能AI绘一幅世界地图?

今天我们分享一下&#xff0c;用智能AI绘一幅世界地图的方法&#xff01; 为了方便你极速体验&#xff0c;特意在文末为你准备了登录帐号&#xff0c;省去你注册的烦恼。 认准AI绘画官网 如果你在百度搜索“AI绘画”或“Midjourney”&#xff0c;找出来的基本全是广告&#…

MSTP环路避免实验

思科设备参考&#xff1a; 一&#xff0c;技术简介 MSTP&#xff08;多生成树协议&#xff09;&#xff0c;MSTP解决了STP和RSTP没有考虑vlan的问题&#xff0c;STP和RSTP将所有的vlan共享为一个生成树实例&#xff0c;无法实现负载分担&#xff0c;这样就导致了网络中一些设…

【深度学习】YOLOv8:别再pip install ultralytics了

&#x1f525;博客主页&#xff1a; A_SHOWY&#x1f3a5;系列专栏&#xff1a;力扣刷题总结录 数据结构 云计算 数字图像处理 力扣每日一题_ 随着YOLOv8的版本不断更新&#xff0c;最新的几个版本会发现没有requirements.txt和setup.py&#xff0c;在安装包的依赖的时候&…

OpenAI奥特曼豪赌1.42亿破解长生不老

生物初创公司 Retro Biosciences 由山姆奥特曼投资1.42亿英镑&#xff0c;公司目标是延长人类寿命。 山姆奥特曼投资背景&#xff1a; 38 岁的奥特曼一直是科技行业的重要参与者。尽管年纪轻轻&#xff0c;奥特曼凭借 ChatGPT 和 Sora 等产品席卷了科技领域。奥特曼对 Reddit…

C语言:指针进阶

一、字符指针 char arr[] "hello";char* p "hello"; //p中存的是"hello"字符串首元素的地址printf("%c\n",*arr); //hprintf("%c\n", *p); //hprintf("%s\n", arr); //"hello",以字符串格式打印&am…