-

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. javascript中filter方法

    array1.filter(callbackfn[, thisArg]) 參數   參數 定義 array1 必要項. 陣列物件. callbackfn 必要項. 最多接受三個引數的函式. filte ...

  2. OC中对象的description方法

    周所周知,我们在做项目时, 可以在类的.m文件中重写该类的对象的描述description方法: 示例: -(NSString *)description{    NSString *str = [N ...

  3. LeetCode28.实现strStr() JavaScript

    实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...

  4. DQL-常见的函数

    一.概述功能:类似于java中的方法好处:提高重用性和隐藏实现细节调用:select 函数名(实参列表); 二:常用的函数: ① 单行函数 1.分组函数 1.sum(),avg(),max(),min ...

  5. js中两个日期大小比较,获取当前日期,日期加减一天

    一.两个日期大小比较 1.日期参数格式:yyyy-mm-dd // a: 日期a, b: 日期b, flag: 返回的结果 function duibi(a, b,flag) { var arr = ...

  6. mysql对查出来的值,在sql里面拼接我们想要拼接的内容

    MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...

  7. MySQL索引的使用及注意事项

    索引是存储引擎用于快速找到记录的一种数据结构.索引优化应该是对查询性能优化最有效的手段了.索引能够轻易将查询性能提高几个数量级,"最优"的索引有时比一个"好的" ...

  8. 浅谈CSS高度坍塌

    高度坍塌情况: 当父元素没有设置高度,且子元素块都向左(右)浮动起来,那么父元素就会出现坍塌的现象. 解决办法: 在父元素包含块中加一个div: 优点:兼容性强,适合初学者. 缺点:不利于优化. 方法 ...

  9. Maven安装配置环境变量及eclipse的配置

    Maven安装与配置   一.需要准备的东西 1. JDK 2. Eclipse 3. Maven程序包 二.下载与安装 1. 前往https://maven.apache.org/download. ...

  10. FMX相关

    ListView的ItemAppearance的样式效果表: Navicat for 插入图片步骤: 如果最后一条记录的图片有问题,可以先插入下一条再导入图片.