题目链接: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 紧急救援的更多相关文章

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

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

  2. PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集

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

  3. 天梯 L2 紧急救援 (dijkstra变形+记录路径)

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

  4. PTA天梯赛L2

    L2-001 紧急救援 题意:就是给你一张n<500的图:让你求最短路径,最短路条数,以及路径: 做法,先用dijkstra求最短路,然后dfs找最短路条数,以及点权的最大值: 一般dfs不就可 ...

  5. PTA L2-001 紧急救援 (带权最短路)

    <题目链接> 题目大意: 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...

  6. 【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 ...

  7. pta l2-1紧急救援(Dijkstra)

    题目链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 题意:给n个城市,m条边,每个城市 ...

  8. PTA 紧急救援 /// dijkstra 最短路数 输出路径

    题目大意: 给定 n m s t :表示n个点编号为0~n-1 m条边 起点s终点t 接下来一行给定n个数:表示第i个点的救援队数量 接下来m行给定u v w:表示点u到点v有一条长度为w的边 求从s ...

  9. pta—紧急救援 (dijkstra)

    题目连接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 题面: 作为一个城市的应急救援队伍 ...

随机推荐

  1. Python SSH爆破以及Python3线程池控制线程数

    源自一个朋友的要求,他的要求是只爆破一个ip,结果出来后就停止,如果是爆破多个,完全没必要停止,等他跑完就好 #!usr/bin/env python #!coding=utf-8 __author_ ...

  2. (转)Awesome Courses

    Awesome Courses  Introduction There is a lot of hidden treasure lying within university pages scatte ...

  3. 使用python+ffmpeg+youtube-dl下载youtube上的视频

    一.准备工作 1.安装python,详见https://www.cnblogs.com/cnwuchao/p/10562416.html 2.安装ffmpeg,详见https://www.cnblog ...

  4. 常用Iview样式布局

    type 布局模式,可选值为flex流式布局或不选,在现代浏览器下有效 flex 布局下的垂直对齐方式,align可选值为top.middle.bottom flex 布局下的水平排列方式,justi ...

  5. MySQL like用法

    MySQL LIKE 语法 LIKE运算符用于WHERE表达式中,以搜索匹配字段中的指定内容,语法如下: WHERE column LIKE pattern WHERE column NOT LIKE ...

  6. Python 爬虫入门3种方法

    Python 2.0 url = "http://www.baidu.com" print '第一种方法' response1 = urllib2.urlopen(url) pri ...

  7. Codeforces 767E Change-free

    题目链接:http://codeforces.com/contest/767/problem/E 居然是一个瞎几把贪心(E比B水系列) 考虑要每一次操作至少要用${\left \lfloor \fra ...

  8. python 部分函数

    abs(number) ,返回数字的绝对值cmath.sqrt(number) ,返回平方根,也可以应用于负数float(object) ,把字符串和数字转换为浮点数help() ,提供交互式帮助in ...

  9. Android JNI 数组操作

    JNI 中有两种数组操作,基础数据类型数组和对象数组,JNI 对待基础数据类型数组和对象数组是不一样的. 基本数据类型数组 对于基本数据类型数组,JNI 都有和 Java 相对应的结构,在使用起来和基 ...

  10. (转)Qt中图片相对位置的引用

    原文作者:locky1218 原文地址:https://blog.csdn.net/locky1218/article/details/9749703/   一般使用相对位置的时候可能无法显示图片,可 ...