L2-001 紧急救援 (25 分)
1.题目描述:
作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。
输入格式:
输入第一行给出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
2.代码展示:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAX=505;
//g[][]数组用来存储任意两个城市之间的距离
//dist[]用来存储最短路径
//num[]数组用来存储每个城市的救援队数量
int g[MAX][MAX],dist[MAX],num[MAX];
//vis[]数组用来判断某个城市是否被访问过
bool vis[MAX];
//sum[]数组用来存储每个城市的最大救援队召集数量
//pathCount[]数组用来存储最短路径的条数
//pre[]用来存储最短路径的经过城市
int sum[MAX],pathCount[MAX],pre[MAX];
//N为城市的数量,M为快速通道的条数
//S为出发地的城市编号,D为目的地的城市的编号
int N,M,S,D;
//从后往前递归,输出途经城市编号
void print(int x){
if(pre[x]!=-1){
print(pre[x]);
cout<<pre[x]<<" ";
}
}
//dijkstra,寻找最短路径,存储最短路径途经城市,更改最短路径的条数
//更改每个城市的最大救援队召集数量
void dijkstra(){
//初始化dist[]数组
memset(dist,0x3f,sizeof dist);
//初始化起点dist[]
dist[S]=1;
//初始化起点的最短路径条数
pathCount[S]=1;
//初始化起点的最大救援队召集数量
sum[S]=num[S];
for(int i=0;i<N;i++){
int t=-1;
for(int j=0;j<N;j++){
if(!vis[j]&&(t==-1 || dist[j]<dist[t]))t=j;
}
//标记t城市被访问过了
vis[t]=true;
//用t号城市去更新其它城市的最短距离
for(int j=0;j<N;j++){
if(!vis[j]){
if((dist[t]+g[t][j])<dist[j]){//存在更短路
dist[j]=dist[t]+g[t][j];
sum[j]=sum[t]+num[j];
pathCount[j]=pathCount[t];
pre[j]=t;
}else if((dist[t]+g[t][j])==dist[j]){//最短路条数增加
pathCount[j]+=pathCount[t];
if(sum[j]<num[j]+sum[t]){//存在更大权值
sum[j]=num[j]+sum[t];
pre[j]=t;
}
}
}
}
}
}
int main(){
//初始化pre[]数组
memset(pre,-1,sizeof pre);
cin>>N>>M>>S>>D;
//初始化g[]数组
memset(g,0x3f,sizeof g);
//输入每个城市的救援队数量
for(int i=0;i<N;i++)cin>>num[i];
//输入各个城市间的距离
while(M--){
int a,b,c;
cin>>a>>b>>c;
g[a][b]=g[b][a]=min(c,g[a][b]);
}
dijkstra();
cout<<pathCount[D]<<" "<<sum[D]<<endl;
print(D);
cout<<D<<endl;
return 0;
}
原题链接:PTA | 程序设计类实验辅助教学平台
L2-001 紧急救援 (25 分)的更多相关文章
- 5-5 城市间紧急救援 (25分)【最短路spfa】
5-5 城市间紧急救援 (25分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速 ...
- PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)
PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...
- 天梯L2-001. 紧急救援(25分)
L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...
- L2-001 紧急救援 (25 分)
L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...
- 城市间紧急救援(25 分)(dijstra变形)
城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...
- L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...
- PAT 甲级 1020 Tree Traversals (25 分)(二叉树已知后序和中序建树求层序)
1020 Tree Traversals (25 分) Suppose that all the keys in a binary tree are distinct positive integ ...
- 7-10 多项式A除以B (25分)(多项式除法)
7-10 多项式A除以B (25分) 这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出 ...
- PTA - - 06-图1 列出连通集 (25分)
06-图1 列出连通集 (25分) 给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N-1N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发, ...
- 中国大学MOOC-陈越、何钦铭-数据结构-2015秋 01-复杂度2 Maximum Subsequence Sum (25分)
01-复杂度2 Maximum Subsequence Sum (25分) Given a sequence of K integers { N1,N2, ..., NK }. ...
随机推荐
- 依图在实时音视频中语音处理的挑战丨RTC Dev Meetup
前言 「语音处理」是实时互动领域中非常重要的一个场景,在声网发起的「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」 活动中,来自百度.寰宇科技和依图的技术专家,围绕该话题进行了 ...
- 使用python自动监控程序运行过程数据
操作系统 :CentOS 7.6.1810_x64 Python 版本 : 2.7.5 一.背景描述 工作中会遇到需要监控程序运行过程数据的情况,比如定时执行监控的cmd并记录执行结果,本文提供一种实 ...
- Quicker快速开发,简单的网页数据爬取(示例,获取天眼查指定公司基础工商数据)
前言 有某个线上项目,没有接入工商接口,每次录入公司的时候,都要去天眼查.企查查或者其他公开数据平台,然后手动录入,一两个还好说,数量多了的重复操作就很烦,而且,部分数据是包含超链接,一不注意就点进去 ...
- 必知必会的 WebSocket 协议
文章介绍 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议,它的出现使客户端和服务器之间的数据交换变得更加简单.WebSocket 通常被应用在实时性要求较高的场景,例如赛事数据. ...
- ARC149(A~E)
Tasks - AtCoder Regular Contest 149 又是114514年前做的题,现在来写 屯了好多,清一下库存 A - Repdigit Number (atcoder.jp) 直 ...
- python入门教程之二十邮件操作
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式. python的smtplib提供了一 ...
- [SVN]SVN checkout 功能不可用 右键只看到提交和更新,没有显示checkout[转载]
不要在受SVN控制的文件夹里点右键,因为这个文件夹已经在SVN控制之下,当然不会允许在里面嵌套另一个SVN版本库 换个不受控的文件夹点右键,比如: D盘根目录 X 参考文献 SVN checkout ...
- SLBR通过自校准的定位和背景细化来去除可见的水印
一.简要介绍 本文简要介绍了论文"Visible Watermark Removal via Self-calibrated Localization and Background Re ...
- 如何确定 this 指向?改变 this 指向的方式有哪些?
this 指向: 1. 全局上下文(函数外) 无论是否为严格模式,均指向全局对象.注意:严格模式下全局对象为undifined 2. 函数上下文(函数内) 默认的,指向函数的调用对象,且是最直接的调用 ...
- 如何使用Webpack工具构建项目
起步 webpack 用于编译 JavaScript 模块.一旦完成 安装,你就可以通过 webpack CLI 或 API 与其配合交互.如果你还不熟悉 webpack,请阅读 核心概念 和 对比, ...