-

PAT - L2-001. 紧急救援

题目链接

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式:

输入第一行给出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

**

题解:这是一道求最短路径的题,这种类型的是我第一次做,开始的时候用的是Dijstra求出最短路径,然后用最短路径的值,和所到达d值,在再进行了一次DFS求最短路径的最大救援数,及其路线,最后样例过了,提交错了,改了好久找不到错。然后百度了一下看了这道题的题解。思路是Dijstra求最短路径的条数 + 一个其他条件的处理(满足最短路径的情况下求最大救援数)。

#include <bits/stdc++.h>
#define inf 99999999
using namespace std; int n, m, s, d, x, y, z;
int a[505], e[505][505], vis[505], dis[505], pre[505], sum[505], count1[505], z1[505]; void init(){
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(i==j)e[i][j]=0;
else e[i][j]=inf; for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<m;i++){
cin>>x>>y>>z;
e[x][y] = e[y][x] = z;
}
} void Dijstra(int v0){
for(int i=0;i<n;i++) dis[i]=inf;
memset(vis,0,sizeof(vis));
memset(count1,0,sizeof(count1));
memset(sum,0,sizeof(sum));
vis[v0] = 1;
count1[v0] = 1;
sum[v0] = a[v0]; for(int i=0;i<n;i++){
dis[i] = e[v0][i];
//此部分为扩展部分 根据优先级应该是路径(一) 然后救援人数(二) 其中还要记录当前路径个数
if( e[v0][i] != inf && i != v0 ){
pre[i] = v0; //用来记录经过i结点必须要经过的上一个结点
sum[i] = a[v0] + a[i]; //用来求从v0到当前结点走过的最长救援人数
count1[i] = 1; //用来记录到达当前路径的个数。
}
}
for(int j=0;j<n;j++){
int min = inf, v = v0;
//Dijstra第一步找出最短路径
for(int i=0;i<n;i++){
if(vis[i]==0 && dis[i]<min){
min = dis[i]; v = i;
}
}
vis[v] = 1;
// 开始更新各个的值
for(int i=0;i<n;i++){
if(vis[i]==0) {
if( dis[i] > dis[v] + e[v][i]) {
dis[i] = dis[v] + e[v][i];//优先级最高的路径先更新
pre[i] = v;
sum[i] = a[i] + sum[v];
count1[i] = count1[v];//路线变为上一个点的路线
}
else if(dis[i] == dis[v]+e[v][i]){
//如果相等的话优先级低的也要更新,且附加的值也会改变
count1[i] = count1[i] + count1[v];
//判断优先级底的是否更新
if( sum[i] < a[i] + sum[v] ){
sum[i] = a[i] + sum[v];
pre[i] = v;
}
}
}
}
}
} int main(){
cin>>n>>m>>s>>d;
init();
Dijstra(s);
cout<<count1[d]<<" "<<sum[d]<<endl;
int i = 0, cur = d;
while(cur!=s){
z1[i++] = cur;
cur = pre[cur];
}
z1[i] = s;
for(;i>0;i--)
cout<<z1[i]<<" ";
cout<<z1[0];
}

PAT - L2-001. 紧急救援( Dijstra )的更多相关文章

  1. loj#6072 苹果树(折半搜索,矩阵树定理,容斥)

    loj#6072 苹果树(折半搜索,矩阵树定理,容斥) loj 题解时间 $ n \le 40 $ . 无比精确的数字. 很明显只要一个方案不超过 $ limits $ ,之后的计算就跟选哪个没关系了 ...

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

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

  3. PAT 垃圾箱分布(30分)dijstra

    垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾 ...

  4. pat 团体天梯赛 L2-001. 紧急救援

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

  5. PAT 甲级 1072 Gas Station (30 分)(dijstra)

    1072 Gas Station (30 分)   A gas station has to be built at such a location that the minimum distance ...

  6. PAT 甲级 1030 Travel Plan (30 分)(dijstra,较简单,但要注意是从0到n-1)

    1030 Travel Plan (30 分)   A traveler's map gives the distances between cities along the highways, to ...

  7. PAT 甲级 1018 Public Bike Management (30 分)(dijstra+dfs,dfs记录路径,做了两天)

    1018 Public Bike Management (30 分)   There is a public bike service in Hangzhou City which provides ...

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

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

  9. Day 001:PAT练习--1091 N-自守数 (15 分)

      体验了一阵子现代生活后,朕发现敲代码还是挺有意思的.所以从今天开始,小编秦始皇开始记录朕做PAT题目的过程辣,那话不多说,开始今天的题目了: 题目描述:   如果某个数 K 的平方乘以 N 以后, ...

随机推荐

  1. ListView 中嵌套 GridView

    1.主布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andr ...

  2. 第21章 DMA—直接存储区访问

    本章参考资料:<STM32F76xxx参考手册>DMA控制器章节. 学习本章时,配合<STM32F76xxx参考手册>DMA控制器章节一起阅读,效果会更佳,特别是涉及到寄存器说 ...

  3. Django开发BUG汇总

    使用版本知悉 limengjiedeMacBook-Pro:~ limengjie$ python --version Python :: Anaconda, Inc. limengjiedeMacB ...

  4. 启动tomcat的时候为啥你启动的是8,启动起来的确实其他的Tomcat

    如果发现,是启动tomcat的时候为啥你启动的是8,启动起来的确实其他的Tomcat ,你可以去看看你的环境变量,是不是配了一个tomcat,

  5. Java中的IO流(三)

    上一篇<Java中的IO流(二)>把学习Java的字符流以及转换流作了一下记录,从本篇开始将把IO流中对文件或文件夹操作的对象File类的学习进行一下记录. 一,File类的构造函数及字段 ...

  6. IOS 文件名获取简洁方式

    //这里有一个模拟器沙盒路径(完整路径) NSString* index=@"/Users/junzoo/Library/Application Support/iPhone Simulat ...

  7. iOS 获取蜂窝网络信号强度 包含iPhoneX XS XR XSMASX (最新)

    1.虽然各种直接获取信号强度的api都被封杀了.但是还有一个另类的黑魔法可以获取到.那就是遍历UIStatusBar了 网络上有的文章写的会崩溃 比如: - (int)getSignalStrengt ...

  8. 新手Linux命令学习

    一.dd命令:1.可以复制文件,2.可以制作ios镜像,简单理解就是备份 常用的参数  if 设置输入文件的名称 of  设置输出文件的名称 bs  设置每个“”块“”大小 count  要复制“块” ...

  9. IO,File对象-构造函数和常用方法

    import java.io.File; import java.text.DateFormat; import java.util.Date; public class FileDemo { pub ...

  10. js实现所有异步请求全部加载完毕后,loading效果消失

    在实际开发中,一定有情况是这样的,一个页面我们有多个地方请求了ajax,在这种情况下,我们要实现数据没来之前出现我们炫酷的loading效果,而且要等到所有的ajax都请求完毕后,才让我们的loadi ...