PAT - L2-001. 紧急救援( Dijstra )
- -
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 )的更多相关文章
- loj#6072 苹果树(折半搜索,矩阵树定理,容斥)
loj#6072 苹果树(折半搜索,矩阵树定理,容斥) loj 题解时间 $ n \le 40 $ . 无比精确的数字. 很明显只要一个方案不超过 $ limits $ ,之后的计算就跟选哪个没关系了 ...
- 城市间紧急救援(25 分)(dijstra变形)
城市间紧急救援(25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道路长度都标 ...
- PAT 垃圾箱分布(30分)dijstra
垃圾箱分布 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾 ...
- pat 团体天梯赛 L2-001. 紧急救援
L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国 ...
- 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 ...
- 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 ...
- 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 ...
- 天梯 L2 紧急救援 (dijkstra变形+记录路径)
L2-001 紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市的救援队数量和每一条连接两个城市的快速道 ...
- Day 001:PAT练习--1091 N-自守数 (15 分)
体验了一阵子现代生活后,朕发现敲代码还是挺有意思的.所以从今天开始,小编秦始皇开始记录朕做PAT题目的过程辣,那话不多说,开始今天的题目了: 题目描述: 如果某个数 K 的平方乘以 N 以后, ...
随机推荐
- 常用的layer弹出层
本文来自 松耦合 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/dunegao/article/details/78978448?utm_source=copy 常用 ...
- vector,set常见方法
vector push_back() 压入元素 size()返回元素个数 swap()交换两个向量的位置 erase()任意位置删除元素 reverse(a.begin(),a.end())翻转 se ...
- Java 创建线程的方式
想必大家在Java面试中经常会被问到有关线程的问题,最常见的莫过于“Java有哪几种创建线程的方式呢?” 稍稍了解过,或者在日常开发中也都会用到以下几种方式: ①继承Thread类(真正意义上的线程类 ...
- Python入门 —— 02基础语法
基础语法入门学习推荐: 简明 Python 教程 下文仅为入门推荐书籍的补充与重点 多行语句:末尾使用斜杠 ( ) ,将一行分为多行 var = item1 + item2 + item3 注释: ...
- MySQL数据库 : 函数和存储过程
CONCAT 可以把多个字符串连在一起,如把 doc_id 和 title这两个字段的查询结果组合成一个字符串:SELECT CONCAT(doc_id,title) FROM simhash; CO ...
- STM32 uart 单线半双工模式(cube版本)
STM32 uart 单线半双工模式(cube版本) 1.引言 在某些场合下需要进行三线制串口通信(信号线只有一根),这就要求进行单线半双工的模式进行通信.在这种情况进行数据协议传输的过程中,信号端需 ...
- ruby 批量下载王者荣耀皮肤
主要采用ruby Parallel库提供的多线程方式: require 'unirest' require 'open-uri' require 'parallel' require 'json' u ...
- C语言自问自答
Windows系统下,最好如何配置环境? notepad++,tdm-gcc,powershell来进行! scanf函数的返回值,和不符合格式如何返回? #include<stdio.h> ...
- 在CentOS7中搭建Zookeeper集群
前几天装了CentOS7.并安装了一些基本的工具,现在我手上有三台机器:分别是master,slave1,slave2. 今天我将搭建zookeeper,使用的版本是zookeeper-3.4.11. ...
- javascript之input字符串不为空
今天我们来讲如何判断这个java中字符串输入是否为空 ------------------------当只有一个input的时候,我们来进行个判断这个值是否为空-------------------- ...