【洛谷P1119】灾后重建

每天做一点 直接看题目吧

P1119 灾后重建

题目背景

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

题目描述

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

输入格式

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

第二行包含 \(N\) 个非负整数 \(t_0,t_1,\cdots,t_{N-1}\),表示了每个村庄重建完成的时间,数据保证了 \(t_0 \le t_1 \le \cdots \le t_{N-1}\)

接下来 \(M\) 行,每行 \(3\) 个非负整数 \(i,j,w\)\(w\) 不超过 \(10000\),表示了有一条连接村庄 \(i\) 与村庄 \(j\) 的道路,长度为 \(w\),保证 \(i\neq j\),且对于任意一对村庄只会存在一条道路。

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

接下来 \(Q\) 行,每行 \(3\) 个非负整数 \(x,y,t\),询问在第 \(t\) 天,从村庄 \(x\) 到村庄 \(y\) 的最短路径长度为多少,数据保证了 \(t\) 是不下降的。

输出格式

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

输入输出样例 #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\%\) 的数据,有 \(N\le 50\)
  • 对于 \(30\%\) 的数据,有 \(t_i=0\),其中有 \(20\%\) 的数据有 \(t_i=0\)\(N>50\)
  • 对于 \(50\%\) 的数据,有 \(Q\le 100\)
  • 对于 \(100\%\) 的数据,有 \(1\le N\le 200\)\(0\le M\le \dfrac{N\times(N-1)}{2}\)\(1\le Q\le 50000\),所有输入数据涉及整数均不超过 \(10^5\)

Solution

这个数据一看都知道是Floyd吧 跑Dijkstra包TLE的
然后再一看 为什么我每次询问的时候跑FloydT两个点
我们啊 要探讨一下Floyd的本质 其实就是在i,j两个点间,用k不断中转,做出类似于DP的操作
那么 我们不需要每次全部跑 只要当前的k无法中转 就continue 否则中转一次就可以放掉了 打一个vis标记
下面放代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int ti[405];
int ma[205][205];
int n,m,Q,x,y,z,t;
int pd[205];
int main(){scanf("%d%d",&n,&m);for(int i=0;i<=n-1;i++){scanf("%d",&ti[i]);}for(int i=0;i<=n-1;i++){for(int j=0;j<=n-1;j++){ma[i][j]=1e8;}}for(int i=0;i<=n-1;i++){ma[i][i]=0;}for(int i=1;i<=m;i++){scanf("%d%d%d",&x,&y,&z);ma[x][y]=z;ma[y][x]=z;}scanf("%d",&Q);for(int i=1;i<=Q;i++){scanf("%d%d%d",&x,&y,&t);if(ti[x]>t||ti[y]>t){printf("-1\n");continue;}for(int k=0;k<=n-1;k++){if(ti[k]>t||pd[k]) continue;pd[k]=1;for(int v=0;v<=n-1;v++){for(int j=0;j<=n-1;j++){ma[v][j]=min(ma[v][j],ma[v][k]+ma[k][j]);}}}if(ma[x][y]==1e8) printf("-1\n");else printf("%d\n",ma[x][y]);}system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/906014.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年-AI工具发展记录

时间:2025-03-06豆包: Kimi: 讯飞星火: 通义千问: DeepSeek: 总结:截止2025年3月6号,各类AI工具相较于2024年最大的变化时,都新增了自家的推理功能!这可以说是新年的一次重大更新!

模型的泛化性能度量:方法、比较与实现

在机器学习领域,模型的泛化性能度量是评估模型在未知数据上表现的关键环节。 通过合理的性能度量,不仅能了解模型的优劣,还能为模型的优化和选择提供科学依据。 本文将深入探讨泛化性能度量的重要性、各种度量方法、它们之间的区别与适用场景,并通过scikit-learn代码示例来…

掌握设计模式--访问者模式

访问者模式(Visitor Pattern) 访问者模式(Visitor Pattern)是一种行为设计模式,它允许你将操作(方法)封装到另一个类中,使得你可以在不修改现有类的情况下,向其添加新的操作。 核心思想是将数据结构和对数据的操作分离,通过访问者对象来对数据进行操作,而不是将操作…

双向广搜-BiDirectional BFS

双向广搜 文章目录 前言前言 复习acwing算法提高课的内容,本篇为讲解算法:双向广搜 一、双向广搜 双向广搜其实就是两个bfs,我们知道bfs是一种暴力的做题方法,搜索树长下图所示:我们会发现搜索树越来越宽,每一层的搜索量增加,如果数据范围很大的话,显然是会TLE的,那么…

读DAMA数据管理知识体系指南31参考数据和主数据概念(上)

读DAMA数据管理知识体系指南31参考数据和主数据概念(上)1. 业务驱动因素 1.1. 满足组织数据需求1.1.1. 组织中的多个业务领域需要访问相同的数据集,并且他们都相信这些数据集是完整的、最新的、一致的1.2. 管理数据质量1.2.1. 数据的不一致、质量问题和差异均会导致决策错误…

生成式 AI 和 LLM 简介 起源 历史记录

领域 年份 定义人工智能 (AI) 1956 计算机科学领域,旨在创造能够复制或超越人类智能的智能机器。机器学习 (Machine Learning) 1997 人工智能的子集,使机器能够从现有数据中学习并根据这些数据进行决策或预测。深度学习 (Deep Learning) 2012 一种机器学习技术,通过使用多层…

拿到代理对象,如何调用增强方法

步骤1 前面已经创建了MathCal的代理对象了,我们在调用方法时加一个断点这里返回的确实是代理对象,这个对象中保存了详细信息(增强器,原始对象等),我们进入bean.add(2, 10) 中,来到 org.springframework.aop.framework.CglibAopProxy.DynamicAdvisedInterceptor.intercept(…

如何保证消息队列的消息只能被消费一次

如何保证消息队列的消息只能被消费一次,首先先保证消息不会丢失 首先先生产者到消费者到消费者有哪些场景会消息丢失一、问题场景 场景一、生产者发送到消息队列失败 场景二、消息队列接受到消息磁盘化失败 场景三、消费者接受到消息消费失败 二、场景原因,如何解决 1、场景一…

Day22_java方法

Java方法 方法重载 package com.xiang.method;public class Demo02 {public static void main(String[] args) {int max = max(20, 100, 10);System.out.println(max);}// 比大小public static int max(int num1,int num2){int result = 0;if (num1 == num2){System.out.printl…

文献阅读《Spectral Networks and Deep Locally Connected Networks on Graphs》

参考博客 第一代图卷积网络:图的频域网络与深度局部连接网络 - 知乎 (zhihu.com) 论文解读一代GCN《Spectral Networks and Locally Connected Networks on Graphs》 - 别关注我了,私信我吧 - 博客园 (cnblogs.com) 论文核心 卷积神经网络得益于所处理的数据具有局部平移不变…

【CodeForces训练记录】Codeforces Round 1013 (Div. 3)

训练情况赛后反思 A题题目读半天,发现日期有前导零,div3还是比较基础一点,但是感觉自己还是不够熟练,D题看出来二分但是调了挺久的 A题 判断取多少个数之后才能构成 20250301,我们维护数字的出现次数,直到所有数字的出现次数全部大于等于 20250301 的出现次数时输出位置即…