当前位置: 首页 > news >正文

P1119 灾后重建【题解】

P1119 灾后重建

题目背景

B 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。

题目描述

给出 B 地区的村庄数 NNN,村庄编号从 000N−1N-1N1,和所有 MMM 条公路的长度,公路是双向的。并给出第 iii 个村庄重建完成的时间 tit_iti,你可以认为是同时开始重建并在第 tit_iti 天重建完成,并且在当天即可通车。若 tit_iti000 则说明地震未对此地区造成损坏,一开始就可以通车。之后有 QQQ 个询问 (x,y,t)(x,y,t)(x,y,t),对于每个询问你要回答在第 ttt 天,从村庄 xxx 到村庄 yyy 的最短路径长度为多少。如果无法找到从 xxx 村庄到 yyy 村庄的路径,经过若干个已重建完成的村庄,或者村庄 xxx 或村庄 yyy 在第 ttt 天仍未重建完成,则需要输出 −1-11

输入格式

第一行包含两个正整数 N,MN,MN,M,表示了村庄的数目与公路的数量。

第二行包含 NNN 个非负整数 t0,t1,⋯ ,tN−1t_0,t_1,\cdots,t_{N-1}t0,t1,,tN1,表示了每个村庄重建完成的时间,数据保证了 t0≤t1≤⋯≤tN−1t_0 \le t_1 \le \cdots \le t_{N-1}t0t1tN1

接下来 MMM 行,每行 333 个非负整数 i,j,wi,j,wi,j,wwww 不超过 100001000010000,表示了有一条连接村庄 iii 与村庄 jjj 的道路,长度为 www,保证 i≠ji\neq ji=j,且对于任意一对村庄只会存在一条道路。

接下来一行也就是 M+3M+3M+3 行包含一个正整数 QQQ,表示 QQQ 个询问。

接下来 QQQ 行,每行 333 个非负整数 x,y,tx,y,tx,y,t,询问在第 ttt 天,从村庄 xxx 到村庄 yyy 的最短路径长度为多少,数据保证了 ttt 是不下降的。

输出格式

QQQ 行,对每一个询问 (x,y,t)(x,y,t)(x,y,t) 输出对应的答案,即在第 ttt 天,从村庄 xxx 到村庄 yyy 的最短路径长度为多少。如果在第 ttt 天无法找到从 xxx 村庄到 yyy 村庄的路径,经过若干个已重建完成的村庄,或者村庄 xxx 或村庄 yyy 在第 ttt 天仍未修复完成,则输出 −1-11

输入输出样例 #1

输入 #1

4 5
1 2 3 4
0 2 1
2 3 1
3 1 2
2 1 4
0 3 5
4
2 0 2
0 1 2
0 1 3
0 1 4

输出 #1

-1
-1
5
4

说明/提示

  • 对于 30%30\%30% 的数据,有 N≤50N\le 50N50
  • 对于 30%30\%30% 的数据,有 ti=0t_i=0ti=0,其中有 20%20\%20% 的数据有 ti=0t_i=0ti=0N>50N>50N>50
  • 对于 50%50\%50% 的数据,有 Q≤100Q\le 100Q100
  • 对于 100%100\%100% 的数据,有 1≤N≤2001\le N\le 2001N2000≤M≤N×(N−1)20\le M\le \dfrac{N\times(N-1)}{2}0M2N×(N1)1≤Q≤500001\le Q\le 500001Q50000,所有输入数据涉及整数均不超过 10510^5105

解析

观察题目,发现它要求任意两点间的最短距离,且数据具有 1≤N≤2001\le N\le 2001N200 的特点,数据很小。所以就想到最短路中的 FloyedFloyedFloyed 算法

FloyedFloyedFloyed 的基本逻辑就是,枚举中间点来确定每对终起点的最短距离。值得注意的是,每次枚举得到的结果是当前最优,但并不是最终答案。

而这道题目中,由于点的是否可用存在限制,所以我们可在枚举中间点时,留个心眼,每次查询的中间点都只枚举到可用点。

因为读题发现,村庄序号增加,修复时间也增加或不变,则只需判断在时间进一步放宽的情况下,在原基础下是否有新的村庄可修复。而且数据保证了 ttt 是不下降的,即每次访问,时间对于之前都是放宽或不变的。这大大方便了做题。

保留之前最短路结果仍然有用。在每次查询时,枚举所有新增的可用村庄作为中间点,算得每对村庄之间的最短路。不必担心某对终起点村庄未修复,因为在查询时再进行判断终起点是否修好,没修好就输出-1,修好就输出记录的最短值,在它们本身修好之前形成的最短路依旧存在啊。

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,q,now;
int t[205];
int dist[205][205];
void build(int k){for(int i=0;i<n;i++){for(int j=0;j<n;j++){dist[i][j]=min(dist[i][j],dist[i][k]+dist[k][j]);//k作为中间点检查是否有最短路}}
}
int main(){cin>>n>>m;for(int i=0;i<n;i++){cin>>t[i];}/*初始化*/memset(dist,0x3f,sizeof dist);for(int i=0;i<n;i++){dist[i][i]=0;} for(int i=1;i<=m;i++){int x,y;cin>>x>>y;cin>>dist[x][y];dist[y][x]=dist[x][y];}//cin>>q;while(q--){int x,y,k;cin>>x>>y>>k;while(t[now]<=k&&now<n){//判断接下来的村庄是否已修复//因为序号增加,修复时间也增加或不变,则只需判断在时间进一步放宽的情况下,在原基础下是否有新的村庄可修复build(now);//加入新的中间点更新最短路now++;//判断下个村庄}if(k<t[x]||k<t[y]){//终起点未修复cout<<-1;}else{if(dist[x][y]==0x3f3f3f3f) cout<<-1;//没路else cout<<dist[x][y];//有最小值}cout<<endl;}return 0;
}

Thanks♪(・ω・)ノ for listening!Can you give me a 赞 QAQ?

http://www.dtcms.com/a/322131.html

相关文章:

  • 【动态规划 | 二维费用背包问题】二维费用背包问题详解:状态设计与转移方程优化
  • 温室韭菜收割机的设计cad【12张】三维图+设计说明书
  • WinForm 实战 (进度条):用 ProgressBar+Timer 打造动态进度展示功能
  • AUTOSAR进阶图解==>AUTOSAR_EXP_AIOccupantAndPedestrianSafety
  • C++ Primer
  • window10本地运行datax与datax-web
  • 吴恩达 深度学习笔记
  • 校招秋招春招小米在线测评小米测评题库|测评解析和攻略|题库分享
  • 阶段二测试
  • 巧妙实现Ethercat转Profinet协议网关匹配光伏电站
  • 《P6464 [传智杯 #2 决赛] 传送门》
  • 五、CV_ResNet
  • Redis的Linux安装
  • python-操作mysql数据库(增删改查)
  • 医疗设备专用电源滤波器的安全设计与应用价值|深圳维爱普
  • Python接口测试实战之搭建自动化测试框架
  • 文学主题的演变
  • 智慧养老场景识别率↑91%!陌讯轻量化模型在独居监护的落地优化
  • 根据ASTM D4169-23e1标准,如何选择合适的流通周期进行测试?
  • 大语言模型的过去与未来——GPT-5发布小谈
  • 机器学习概念1
  • 数据库基础--多表关系,多表查询
  • 中小型企业ERP实施成本高?析客ERP系统独立部署+模块化配置的务实解决方案
  • ENET_GetRxFrame vs ENET_ReadFrame
  • MySQL 正则表达式详细说明
  • AI摄像头动捕:让动作分析更自由、更智能、更高效
  • 刚刚,GPT-5 炸裂登场!可免费使用
  • Word中怎样插入特殊符号
  • seo-使用nuxt定义页面标题和meta等信息
  • 11_Mybatis 是如何进行DO类和数据库字段的映射的?