PTA L2-001 紧急救援
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840
题目大意:就是让你找一个单源最短路,同时还需要能够输出最短路的路径
输入:
第一行n,m,s,d,分别是城市数,路径数,起点,终点。
第二行n个数,是每个城市有的救援队的数目
接下来m行就是每条道路的两个端点和长度
输出:
第一行输出最短路径条数和救援队数量,第二行就是从起点到终点的路径。
分析:本质上还是用dij做的最短路问题,但需要添加些东西,我们可以用num数组表示从起点到i的最短路径条数,w数组表示救援队数量
同时最用dij做最短路的时候,把最短路径上每个城市的前驱用pre数组记录下来
这样,在更新最短路时,如果dis[e.to]>dis[v]+e.cost 就需要将v和e.to连接起来,那么num[e.to]就应该和num[v]保持一致,w[e.to]=w[v]+a[e.to]
除了大于的情况,对于dis[e.to]==dis[v]+e.cost,我们也需要考虑,因为e.to的最短路径条数除了本身的,还有从v连接过来的,则num[e.to]+=num[v]
如果w[v]+a[e.to]>w[e.to],那么w[e.to]=w[v]+a[e.to],因为要保证救援队数量最多
另外每当连路径的时候记得把pre数组录入一下,最后递归输出即可
#include <bits/stdc++.h>
using namespace std;
const int inf=<<;
typedef long long ll;
typedef pair<int,int> P;
const double pi=acos(-);
const int mod=1e8+;
const int maxn=;
const int maxm=;
int dis[maxn];
int a[maxn],num[maxn],w[maxn],pre[maxn];//num数组是出发点到i点时拥有的路径的条数,w数组是救援队的数目
struct edge{
int to,cost;
};
int x,y,z,n,m,s,d;
vector<edge> g[maxm];
void dij(int s){
priority_queue<P,vector<P>,greater<P> > que;
fill(dis,dis+maxn,inf);
dis[s]=;
w[s]=a[s],num[s]=;//初始化,到起始点救援队数量就是起始点本身救援队数量,路径也只有一条
que.push({,s});
while(!que.empty()){
P p=que.top();que.pop();
int v=p.second;
if(dis[v]<p.first) continue;
for(int i=;i<g[v].size();i++){
edge e=g[v][i];
if(dis[e.to]>dis[v]+e.cost){//这种情况肯定要从v到e.to了
num[e.to]=num[v];
w[e.to]=w[v]+a[e.to];
dis[e.to]=dis[v]+e.cost;
pre[e.to]=v;
que.push({dis[e.to],e.to});
}
else if(dis[e.to]==dis[v]+e.cost){
if(w[v]+a[e.to]>w[e.to]){w[e.to]=w[v]+a[e.to];pre[e.to]=v;}
num[e.to]+=num[v]; //还要再加上v点的
}
}
}
}
void print(int c){
if(c==s){
cout<<s;return;
}
print(pre[c]);
cout<<" "<<c;
}
int main(){
scanf("%d%d%d%d",&n,&m,&s,&d);
for(int i=;i<n;i++) scanf("%d",&a[i]);
for(int i=;i<m;i++){
scanf("%d%d%d",&x,&y,&z);
g[x].push_back({y,z});
g[y].push_back({x,z});
}
dij(s);
cout<<num[d]<<" "<<w[d]<<endl;
print(d);
cout<<endl;
return ;
}
PTA L2-001 紧急救援的更多相关文章
- PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)
PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...
- PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集
L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快 ...
- 天梯 L2 紧急救援 (dijkstra变形+记录路径)
L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...
- PTA天梯赛L2
L2-001 紧急救援 题意:就是给你一张n<500的图:让你求最短路径,最短路条数,以及路径: 做法,先用dijkstra求最短路,然后dfs找最短路条数,以及点权的最大值: 一般dfs不就可 ...
- PTA L2-001 紧急救援 (带权最短路)
<题目链接> 题目大意: 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...
- 【EMV L2】2CS.001.00 ~ 2CS.007.00
测试case要求,对于T=0和T=1卡,命令中是否存在Le是有差异的: - Select: Mandatory Command00 A4 04 00 Lc Command Data LeLc = 05 ...
- pta l2-1紧急救援(Dijkstra)
题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 题意:给n个城市,m条边,每个城市 ...
- PTA 紧急救援 /// dijkstra 最短路数 输出路径
题目大意: 给定 n m s t :表示n个点编号为0~n-1 m条边 起点s终点t 接下来一行给定n个数:表示第i个点的救援队数量 接下来m行给定u v w:表示点u到点v有一条长度为w的边 求从s ...
- pta—紧急救援 (dijkstra)
题目连接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 题面: 作为一个城市的应急救援队伍 ...
随机推荐
- cat查看文件以及sed查看指定行数
https://unix.stackexchange.com/questions/288521/with-the-linux-cat-command-how-do-i-show-only-certai ...
- P3317 [SDOI2014]重建
思路 变元矩阵树定理可以统计最小生成树边权积的和,将A矩阵变为边权,D变为与该点相连的边权和,K=D-A,求K的行列式即可 把式子化成 \[ \begin{align}&\sum_{T}\pr ...
- SPOJ 687 REPEATS - Repeats
题意 给定字符串,求重复次数最多的连续重复子串 思路 后缀数组的神题 让我对着题解想了快1天 首先考虑一个暴力,枚举循环串的长度l,然后再枚举每个点i,用i和i+l匹配,如果匹配长度是L,这个循环串就 ...
- volatile 变量使用
1,对其它线程可见性.原理是:别的线程每次使用前都是要刷新一下值,并不是原子性同步.所有还是会出现线程不安全. 2,禁止指令重新排序.也就是会出现机器实际执行可能和代码的顺序不一样.使用volatil ...
- 用yarn代替cnpm,cnpm漏包有点严重
npm 的方式 npm install -g yarn 安装完成后,你可以测试下自己的版本 yarn --version 开始使用 单独安装包的方式add 不是install,后面不用加 ...
- C++笔记(2018/2/6)
引用 & 某个变量的引用,等价于这个变量,相当于该变量的一个别名. 定义引用时一定要将其初始化成引用某个变量. 初始化后,它就一直引用该变量,不会再引用别的变量了. 通过引用所做的读写操作,会 ...
- _itemmod_strengthen_item
`enchant_id`升级后的附魔Id `prev_enchant_id` 上级附魔Id `description` 描述,出现在菜单中 `enchantReqId`升级附魔效果的消耗模板 `rem ...
- 【BZOJ】3143: [Hnoi2013]游走
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3143 显然如果一条边期望被走过的次数越多,我们就应该给它的编号越小. 所以问题变为如何求每 ...
- Codeforces Round #271 (Div. 2) F. Ant colony 线段树
F. Ant colony time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- tips 移入悬浮功能
前景: 页面部分区域需要移入悬浮效果,当然默认的 title 也是可以的,最多只是格格不入,但是却是最为靠谱的.. 思路: 基于 jq 实例扩展 .使用立即执行函数保持功能独立. 自定义类实现功能封装 ...