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 }. ...
随机推荐
- 声网 VQA:将实时互动中未知的视频画质用户主观体验变可知
在实时互动场景中,视频画质是影响观众体验的关键指标,但如何实时评价视频的画质一直是个行业难题,需要将未知的视频画质用户主观体验变成可知. 未知的部分往往是最需要攻克的,声网也一直在持续探索符合实时互动 ...
- 别再傻傻分不清 AVSx H.26x MPEG-x 了
在音视频发展的历程中,编解码无疑是其最核心的功能,编解码标准的更新换代也极大促进了音视频技术的发展以及行为模式的变更.从电视到网络视频以及现在的网络直播.点播.音视频会议等等,这些变化的背后都离不开音 ...
- Win10系统总是锁屏关闭屏幕该怎么办?
Win10系统总是锁屏关闭屏幕该怎么办? 转目前发现最早之帖,自脚本之家:https://www.jb51.net/os/win10/398451.html 使用Win10系统很长时间了,最近发现 ...
- Onetable:统一的表格式元数据表示
概括 Onehouse 客户现在可以将他们的 Hudi 表查询为 Apache Iceberg 和/或 Delta Lake 表,享受从云上查询引擎到顶级开源项目的原生性能优化. 在数据平台需求层次结 ...
- 看我如何用定值 Cookie 实现反爬
摘要:本次案例,用定值Cookie实现反爬. 本文分享自华为云社区<我是怎么用一个特殊Cookie,限制住别人的爬虫的>,作者: 梦想橡皮擦 . Cookie 生成 由于本案例需要用到一个 ...
- C++ 测试框架 GoogleTest 初学者入门篇 乙
*以下内容为本人的学习笔记,如需要转载,请声明原文链接微信公众号「ENG八戒」https://mp.weixin.qq.com/s/aFeiOGO-N9O7Ab_8KJ2wxw 开发者虽然主要负责工程 ...
- kubernetes核心实战(一)--- namespace
kubernetes核心实战 1.资源创建方式 命令行创建 yaml文件创建 2.namespace 命名空间(namespace)是Kubernetes提供的组织机制,用于给集群中的任何对象组进行分 ...
- window设置开启启动程序的几种方式比较
一.设置开机启动项 进入启动文件夹,拷贝程序的快捷方式到这个文件夹即可. 可在任务管理器--启动,查看是否设置成功 启动时间:用户登陆之后. 二.使用计划任务设置自启 进入计划任务界面进行配置,按wi ...
- StampedLock:JDK1.8中新增,比ReadWriteLock还快的锁
摘要:StampedLock是一种在读取共享变量的过程中,允许后面的一个线程获取写锁对共享变量进行写操作,使用乐观读避免数据不一致的问题,并且在读多写少的高并发环境下,比ReadWriteLock更快 ...
- Spring源码系列:初探底层,手写Spring
前言 在学习Spring框架源码时,记住一句话:源码并不难,只需要给你各种业务场景或者项目经理,你也能实现自己的Spring.虽然你的实现可能无法与开源团队相媲美,但是你肯定可以实现一个0.0.1版本 ...