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 }. ...
随机推荐
- Linux & 标准C语言学习 <DAY2>
vim文本编辑器: 可以直接在终端下采用纯键盘操作的一款文本编辑器,号称编辑器之神,可以二次升级.可以扩展 基础用法: 1.进入vim: 输入 ...
- linq小结
普通查询 var query = from s in context.Student select s; //投影列 var query = from s in context.Student sel ...
- 抽象同步队列AQS原理和实践
AQS简述 AQS是一个FIFO的双向队列,队列元素类型为Node(也就是Thread).AQS有一个state属性,ReentrantLock可以用来便是当前线程获取锁的可重入次数:对于samaph ...
- flex布局相关属性记录
<template> <div class="about"> <h3>flex相关的属性</h3> <div class=&q ...
- 微前端框架single-spa子应用加载解析
作者:京东物流 宁冲 1 前言 什么是微前端? 微前端是指存在于浏览器中的微服务. 本文主要通过对微前端框架single-spa的基座应用加载子应用的single-spa-vue函数库进行分析,通过代 ...
- AI算法测试之浅谈
作者:京东物流 李云敏 一.人工智能 1.人工智能(AI)是什么 人工智能,英文Artificial Intelligence,简称AI,是利用机器学习技术模拟.延伸和扩展人的智能的理论.方法.技术及 ...
- 统计数据异常值的处理——R语言
在数据分析工作中,面对收集而来的数据,数据清洗是首要环节.异常值(outlier)是数据清洗的重要环节,异常值可能直接会导致后面的数据分析.建模工作出现偏差,下面就给大家介绍一下如何处理数据中的异常值 ...
- 数据挖掘系统聚类—R实现
系统聚类法 聚类就是按照某个特定标准把一个数据集分割成不同的类或簇,最后的结果是希望同类之间的差异性尽可能小,不同类之间的差异性尽可能大.不同的类具有能够表达异于其他类的指标,这样针对不同的类,后续就 ...
- LeeCode 回溯问题
1 组合问题 LeeCode 39:组合总和 题目描述 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 ta ...
- 安全测试前置实践1-白盒&黑盒扫描
作者:京东物流 陈维 一.引言 G.J.Myers在<软件测试的艺术>中提出:从心理学角度来说,测试是一个为了寻找错误而运行程序的过程. 那么安全测试则是一个寻找系统潜在安全问题的过程,通 ...