题目背景

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

题目描述

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

输入输出格式

输入格式:

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

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

接下来 MMM 行,每行 333 个非负整数 i,j,wi, j, wi,j,w , www 为不超过 100001000010000 的正整数,表示了有一条连接村庄 iii 与村庄 jjj 的道路,长度为 www ,保证 i≠ji≠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 的最短路径长度为多少。如果在第t天无法找到从 xxx 村庄到 yyy 村庄的路径,经过若干个已重建完成的村庄,或者村庄x或村庄 yyy 在第 ttt 天仍未修复完成,则输出 −1-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%30\%30% 的数据,有 N≤50N≤50N≤50 ;

对于 30%30\%30% 的数据,有 ti=0t_i= 0ti​=0 ,其中有 20%20\%20% 的数据有 ti=0t_i = 0ti​=0 且 N>50N>50N>50 ;

对于 50%50\%50% 的数据,有 Q≤100Q≤100Q≤100 ;

对于 100%100\%100% 的数据,有 N≤200N≤200N≤200 , M≤N×(N−1)/2M≤N \times (N-1)/2M≤N×(N−1)/2 , Q≤50000Q≤50000Q≤50000 ,所有输入数据涉及整数均不超过 100000100000100000 。


看到这题数据范围就不停地想O(QN)的算法,但是没想到。

想到了另一种暴力的方法,就是我们对于每一个询问(x, y, t),都把t之前没有恢复的村庄恢复,然后跑Floyd暴力更新。

想都没想就是O(QN^2)...

想不到别的做法,弃疗了写一发暴力...woc?A了?

然后才认真的分析了一下复杂度,我们发现不管Q有多少,我们最多只会并且必须拓展n个节点,对于每个中转节点,都跑一遍枚举两个端点Floyd,所以是O(N^3)的...

看来以后要认真分析复杂度,否则想出正解都以为是错的...


#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
inline int read(){
int res=;char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch)){res=(res<<)+(res<<)+(ch^);ch=getchar();}
return res;
}
int n, m, Q;
int t[], top;
int dis[][]; int main()
{
n = read(), m = read();
for (int i = ; i <= n ; i ++) t[i] = read();
top = ;
memset(dis, 0x3f, sizeof dis);
for (int i = ; i <= m ; i ++)
{
int x = read() + , y = read() + , z = read();
dis[x][y] = dis[y][x] = z;
}
Q = read();
while(Q--)
{
int x = read() + , y = read() + , z = read();
bool fl = ;
if (t[x] > z or t[y] > z) fl = ;
while(t[top] <= z and top <= n)
{
for (register int i = ; i <= n ; i ++)
if (i != top)
for (register int j = ; j <= n ; j ++)
if (j != top and j != i)
dis[i][j] = min(dis[i][j], dis[i][top] + dis[top][j]);
top++;
}
if (dis[x][y] == 0x3f3f3f3f or fl) printf("-1\n");
else printf("%d\n", dis[x][y]);
}
return ;
}

Luogu1119灾后重建的更多相关文章

  1. CODEVS 1817 灾后重建 Label:Floyd || 最短瓶颈路

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

  2. AC日记——灾后重建 洛谷 P1119

    灾后重建 思路: 看到n<=200,思考弗洛伊德算法: 如何floyed呢? floyed是一种动态规划求最短路的算法: 它通过枚举中间点来更新两点之间最短路: 回到这个题本身: 所有点的重建完 ...

  3. 洛谷——P1119 灾后重建

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

  4. 【洛谷P1119题解】灾后重建——(floyd)

    这道题告诉我,背的掉板子并不能解决一切问题,理解思想才是关键,比如不看题解,我确实想不清楚这题是弗洛伊德求最短路 (我不该自不量力的说我会弗洛伊德了我错了做人果然要谦虚) 灾后重建 题目背景 B地区在 ...

  5. 洛谷 P1119 灾后重建 最短路+Floyd算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1119 灾后重建 题目描述 B地区在地震过后,所有村 ...

  6. java实现第六届蓝桥杯灾后重建

    灾后重建 题目描述 Pear市一共有N(<=50000)个居民点,居民点之间有M(<=200000)条双向道路相连.这些居民点两两之间都可以通过双向道路到达.这种情况一直持续到最近,一次严 ...

  7. [Luogu P1119] 灾后重建 (floyd)

    题面 传送门:https://www.luogu.org/problemnew/show/P1119 Solution 这题的思想很巧妙. 首先,我们可以考虑一下最暴力的做法,对每个时刻的所有点都求一 ...

  8. 【u110】灾后重建

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前, ...

  9. 洛谷P1119 灾后重建[Floyd]

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

随机推荐

  1. C#中using的使用-以FileStream写入文件为例

    场景 CS中FileStream的对比以及使用方法: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100396022 关注公众号 ...

  2. ThreadLocal的认知与见解

    ThreadLocal:提高一个线程的局部变量,访问某个线程拥有自己局部变量(很难理解.看看下面这句话,顺便再讲个例子). 当使用ThreadLocal维护变量时,ThreadLocal为每一个使用该 ...

  3. Python3 爬虫之 Scrapy 框架安装配置(一)

    博客地址:http://www.moonxy.com 基于 Python 3.6.2 的 Scrapy 爬虫框架使用,Scrapy 的爬虫实现过程请参照本人的另一篇博客:Python3 爬虫之 Scr ...

  4. python语言程序设计部分习题

    第二章 python程序实例解析 程序练习题 2.1   实例1的修改,采用eval(input(<提示内容>))替换现有输入部分,并使输出的温度值为整数. vv 2.2 汇率兑换程序.按 ...

  5. 使用 Nginx 部署前后端分离项目,解决跨域问题

    前后端分离这个问题其实松哥和大家聊过很多了,上周松哥把自己的两个开源项目部署在服务器上以帮助大家可以快速在线预览(喜大普奔,两个开源的 Spring Boot + Vue 前后端分离项目可以在线体验了 ...

  6. 如何更规范化编写Java 代码

    如何更规范化编写Java 代码 Many of the happiest people are those who own the least. But are we really so happy ...

  7. mongodb 获取自增数

    mongodb db.getCollection('user').findAndModify({update:{$inc:{'level':1}},query:{"name":&q ...

  8. 死磕 java线程系列之线程模型

    问题 (1)线程类型有哪些? (2)线程模型有哪些? (3)各语言使用的是哪种线程模型? 简介 在Java中,我们平时所说的并发编程.多线程.共享资源等概念都是与线程相关的,这里所说的线程实际上应该叫 ...

  9. http转换为https

    1.下载ssl 证数 百度ssl 证数都有 其中以便宜ssl为例子 注册登陆 选择免费版 可以使用3个月: 申请过程中需要检测该域名是否为本人所有 ,所以邮箱检测或者域名配置 很简单检测就好了: 验证 ...

  10. java基础之泛型对象与json互转

    1. 场景描述 把泛型对象转成字符串放到缓存中,获取后使用有点问题,记录下,有碰到的朋友,参考下. 2. 解决方案 2.1 操作类及说明 /** * @auther: 软件老王 */ public s ...