PTA (Advanced Level) 1003 Emergency
Emergency
As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length of each road between any pair of cities are marked on the map. When there is an emergency call to you from some other city, your job is to lead your men to the place as quickly as possible, and at the mean time, call up as many hands on the way as possible.
Input Specification:
Each input file contains one test case. For each test case, the first line contains 4 positive integers: N (≤) - the number of cities (and the cities are numbered from 0 to N−1), M- the number of roads, C1 and C2 - the cities that you are currently in and that you must save, respectively. The next line contains N integers, where the i-th integer is the number of rescue teams in the i-th city. Then M lines follow, each describes a road with three integers c1, c2 and L, which are the pair of cities connected by a road and the length of that road, respectively. It is guaranteed that there exists at least one path from C1 to C2.
Output Specification:
For each test case, print in one line two numbers: the number of different shortest paths between C1 and C2, and the maximum amount of rescue teams you can possibly gather. All the numbers in a line must be separated by exactly one space, and there is no extra space allowed at the end of a line.
Sample Input:
5 6 0 2
1 2 1 5 3
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1
Sample Output:
2 4
题目解析
本题有若干个城市与若干条连接城市的道路,每个城市中会有一定数量的救援队,要求解初给出两城市之间的最短路条数,并求出在最短路的情况下所能聚集的救援队的最大数量。
第一行给出4个正整数,分别为N(<=500)-城市数量(城市编号由0 ~ N-1,M-道路的条数,C1、C2 – 给出的两个城市。第二行给出N个整数,分别为第0 ~ N-1号城市所拥有的救援队数量。之后给随M行表示道路信息,每行包括道路两端的城市c1、 c2 与道路长度L。
由于城市最高数量只有500,所以可以之间用一个二维数组来储存道路信息,用一维数组teamCnt储存每个城市所拥有的救援队数量,vector<int>pre[i] 存储i城市的前驱城市,之后dijkstra获取每个城市的前驱,这样便可以构建出一张由最短路径组成的邻接表。之后dfs这张邻接表获取C1到C2的最短路径数量与最多课聚集救援队数量即可。
#include <bits/stdc++.h>
using namespace std;
const int MAX = ;
int n, m, c1, c2;
int G[MAX][MAX];
int teamCnt[MAX];
int d[MAX];
bool vis[MAX] = {false};
vector<int> pre[MAX];
void dijkstra(int bg){
fill(d, d + n, INT_MAX); //初始化起点到任何点的距离都为正无穷
d[bg] = ; //起点到本身的距离为0
for(int i = ; i < n ; i++){
int minCity = -, minDis = INT_MAX;
//minCity保存最近的城市 minDis保存最近的距离
for(int j = ; j < n; j++){ //找到当前还未访问过的距离起点最近的城市
if(d[j] < minDis && !vis[j]){
minDis = d[j];
minCity = j;
}
}
if(minCity == -) //若minCity为-1证明其他城市都不与起点连通
return;
vis[minCity] = true; //将找出的最近城市标记为已访问
for(int next = ; next < n; next++){ //遍历所有点
if(!vis[next] && d[next] > d[minCity] + G[minCity][next] && G[minCity][next] != ){
//若存在未访问的点next 与起点之间的距离可被minCity优化 优化该点
d[next] = d[minCity] + G[minCity][next];
pre[next].clear();
pre[next].push_back(minCity);
//将next的前驱清空并将minCity计入next的前驱
}else if(!vis[next] && d[next] == d[minCity] + G[minCity][next] && G[minCity][next] != ){
//若存在未访问的点next 与起点之间的距离和以minCity为中转的距离相等
pre[next].push_back(minCity);
//将minCity计入next的前驱
}
}
}
}
int maxTeamCnt = INT_MIN;
//记录最大聚集救援队数量
int roadCnt = ;
//记录最短路数量
void dfs(int ed, int nowTeamCnt){ //由终点向起点搜索 nowTeamCnt表示当前聚集的救援队数量
if(ed == c1){ //若搜索到起点
maxTeamCnt = max(maxTeamCnt, nowTeamCnt); //获取最大聚集数量
roadCnt++; //最短路加一
}
for(auto i : pre[ed]){ //遍历ed的前驱
if(!vis[i]){ //若前驱还每有被计入道路
vis[i] = true;
dfs(i, nowTeamCnt + teamCnt[i]);
vis[i] = false;
}
}
}
int main()
{
scanf("%d%d%d%d", &n, &m, &c1, &c2);
//输入城市数量n 道路数量m 要计算最短路的城市c1与c2
for(int i = ; i < n; i++) //输入每个城市的救援队数量
scanf("%d", &teamCnt[i]);
memset(G, , sizeof(G)); //初始化任意两个城市之间距离为0
for(int i = ; i < m; i++){ //输入道路信息
int u, v;
scanf("%d%d", &u, &v);
scanf("%d", &G[u][v]);
G[v][u] = G[u][v];
}
dijkstra(c1); //最短路以c1为起点获取前驱
memset(vis, false, sizeof(vis));
dfs(c2, teamCnt[c2]);
printf("%d %d\n", roadCnt, maxTeamCnt);
return ;
}
PTA (Advanced Level) 1003 Emergency的更多相关文章
- PAT (Advanced level) 1003. Emergency (25) Dijkstra
As an emergency rescue team leader of a city, you are given a special map of your country. The map s ...
- PAT (Advanced Level) 1003. Emergency (25)
最短路+dfs 先找出可能在最短路上的边,这些边会构成一个DAG,然后在这个DAG上dfs一次就可以得到两个答案了. 也可以对DAG进行拓扑排序,然后DP求解. #include<iostrea ...
- PTA(Advanced Level)1036.Boys vs Girls
This time you are asked to tell the difference between the lowest grade of all the male students and ...
- PTA (Advanced Level) 1004 Counting Leaves
Counting Leaves A family hierarchy is usually presented by a pedigree tree. Your job is to count tho ...
- PTA (Advanced Level) 1020 Tree Traversals
Tree Traversals Suppose that all the keys in a binary tree are distinct positive integers. Given the ...
- PTA(Advanced Level)1025.PAT Ranking
To evaluate the performance of our first year CS majored students, we consider their grades of three ...
- PTA (Advanced Level) 1009 Product of Polynomials
1009 Product of Polynomials This time, you are supposed to find A×B where A and B are two polynomial ...
- PTA (Advanced Level) 1008 Elevator
Elevator The highest building in our city has only one elevator. A request list is made up with Npos ...
- PTA (Advanced Level) 1007 Maximum Subsequence Sum
Maximum Subsequence Sum Given a sequence of K integers { N1, N2, ..., NK }. A continuous su ...
随机推荐
- excel函数累加求和与累计百分比应用
申明:为了方便记忆,该笔记内容纯属拷贝,如与原创雷同,请加我为火山小视频好友:345270311,必将献上好段子已表感谢~ 正传 以下表为例,求公里数的累加求和以及累计百分比. 在D2单元格输入=su ...
- noip第20课作业
1. 评学习小标兵 [问题描述] 东东所在的班级有 N 名同学,期末考试进行了数学.语文.英语.地理四门功课的测试.班主任要将这 N 名学生中总分前三名定为本学期的“学习小标兵”.现在给出这N 名学生 ...
- java基础-day11
第11天 综合练习 今日内容介绍 u 综合练习 第1章 综合练习 1.1 综合练习一 A:键盘录入3个学生信息(学号,姓名,年龄,居住地)存入集合,要求学生信息的学号不能重复 B:遍历集 ...
- 一个前端小白,关于vue\react等框架下table的应用总结
出来实习一个月多,对于前端,运用相关的最多的就是table,想总结一下先关的内容 一.table提供的功能 1.显示表 2.可编辑:分为可编辑行和可编辑块,但是原理都一样就是设置一个flag,true ...
- 冲刺博客NO.1
今天小组开了一个会议来对APP进行模块分析,从客户需求 隐私问题到 界面设计大致定了一个方向并分工. 做的内容:对自己负责的模块进行了粗略的划分和认识,学会了如何页面跳转. 我负责的是登录界面,主界 ...
- 深度学习主机环境配置: Ubuntu16.04+GeForce GTX 1080+TensorFlow
接上文<深度学习主机环境配置: Ubuntu16.04+Nvidia GTX 1080+CUDA8.0>,我们继续来安装 TensorFlow,使其支持GeForce GTX 1080显卡 ...
- C# 判断access建库、建表、文件是否存在等
1.创建数据库 2.判断表是否存在 3.创建表 1. #region access数据库操作 之 创建数据库 private void creatMDB(string dbNam ...
- 尝试asp.net mvc 基于controller action 方式权限控制方案可行性(转载)
微软在推出mvc框架不久,短短几年里,版本更新之快,真是大快人心,微软在这种优秀的框架上做了大量的精力投入,是值得赞同的,毕竟程序员驾驭在这种框架上,能够强力的精化代码,代码层次也更加优雅,扩展较为方 ...
- 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom
[源码下载] 背水一战 Windows 10 (47) - 控件(ScrollViewer 特性): Chaining, Rail, Inertia, Snap, Zoom 作者:webabcd 介绍 ...
- 100道Java基础面试题
1.什么是B/S架构?什么是C/S架构 B/S(Browser/Server),浏览器/服务器程序 C/S(Client/Server),客户端/服务端,桌面应用程序 2.你所知道网络协议有那些? H ...