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 分)的更多相关文章

  1. 5-5 城市间紧急救援 (25分)【最短路spfa】

    5-5 城市间紧急救援   (25分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速 ...

  2. PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)

    PTA数据结构与算法题目集(中文)  7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...

  3. 天梯L2-001. 紧急救援(25分)

    L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...

  4. L2-001 紧急救援 (25 分)

    L2-001 紧急救援 (25 分)   作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...

  5. 城市间紧急救援(25 分)(dijstra变形)

    城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...

  6. L2-006 树的遍历 (25 分) (根据后序遍历与中序遍历建二叉树)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805069361299456 L2-006 树的遍历 (25 分 ...

  7. PAT 甲级 1020 Tree Traversals (25 分)(二叉树已知后序和中序建树求层序)

    1020 Tree Traversals (25 分)   Suppose that all the keys in a binary tree are distinct positive integ ...

  8. 7-10 多项式A除以B (25分)(多项式除法)

    7-10 多项式A除以B (25分)   这仍然是一道关于A/B的题,只不过A和B都换成了多项式.你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数. 输入格式: 输入分两行,每行给出 ...

  9. PTA - - 06-图1 列出连通集 (25分)

    06-图1 列出连通集   (25分) 给定一个有NN个顶点和EE条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N-1N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发, ...

  10. 中国大学MOOC-陈越、何钦铭-数据结构-2015秋 01-复杂度2 Maximum Subsequence Sum (25分)

    01-复杂度2 Maximum Subsequence Sum   (25分) Given a sequence of K integers { N​1​​,N​2​​, ..., N​K​​ }. ...

随机推荐

  1. web初始:html记忆

    12.13html框架 <! DOCTYPE html> <html lang="zh-CN"> <head> <meta charset ...

  2. 谈谈Selenium中的日志

    谈谈Selenium中的日志 来源于一位同学,"老师为啥firefox执行后会有日志文件,chrome没有呢?" 比对 你打开chrome浏览器 from selenium imp ...

  3. HashMap正确遍历方式,千万不要再forforfor啦!!!

    for (int i = 0; i < map.size(); i++) { if (map.get(i)/n>=0.01) { num++; } } 上述代码报空指针异常.为什么? 循环 ...

  4. ArgoCD实践之基于配置清单创建Application

    1. 什么是Application ArgoCD的两个核心概念为Application和Project,他们可分别基于Application CRD和AppProject CRD创建; 核心组件: A ...

  5. 从头开始,手写android应用框架(一)

    前言 搭建android项目框架前,我们需要先定义要框架的结构,因为android框架本身的结构就很复杂,如果一开始没定义好结构,那么后续的使用就会事倍功半. 结构如下: com.kiba.frame ...

  6. [工具/Maven]Maven工程目录结构 | Maven自动构建骨架(maven-archetype)中quickstart与webapp的区别

    1 maven-archetype-quickstart 1.1 IDEA中的前期准备 1.2 自动构建后 ↓pom.xml↓ <?xml version="1.0" enc ...

  7. 4.测试类mapper报错

    1.总结:前几天还有今天一直在弄测试类报错的原因,想着项目是一个大整体,写一个mappe测试类,测试一个mapper,这样后面不会出错: 但是在测试mapper的时候一直,出现mapper值为空的异常 ...

  8. Springboot一些常用注解

    Springboot启动注解 @SpringbootApplication 这个注解是Springboot最核心的注解,用在Springboot的主类上,标识这是一个Springboot应用,用来开启 ...

  9. stm32报错

    1. declaration may not appear after executable statement in block 关于编译错误的小伙伴:error: #268: declaratio ...

  10. group_concat_max_len设置过小致group_concat()排列不全

    问题描述:group_concat_max_len默认值1024导致group_concat函数排列显示不足 group_concat_max_len长度显示跟group_concat排列长度息息相关 ...