题面

题目链接

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,…, t_{N-1} $ ,表示了每个村庄重建完成的时间,数据保证了 $ t_0 \leq t_1 \leq ... \leq t_{N-1} $

接下来 $ M $ 行,每行 $ 3 $ 个非负整数 $ i,j,w $ , $ w $ 为不超过 $ 10000 $ 的正整数,表示了有一条连接村庄 $ i $ 与村庄 $ j $ 的道路,长度为 $ w $ ,保证 $ i≠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 $ 。

输入输出样例

输入样例

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
5
4

说明

【数据范围】

对于30%的数据,有 $ N \leq 50 $;

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

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

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

【时空限制】

1000ms,128M

思路

首先看到要多次询问两点间的最短路,可以考虑用Floyd算法。可是两点间的距离是随着时间而变化的,怎么办呢?

显然我们可以这样做:当每次询问时,我们将此时已经修建好的村庄之间跑一遍Floyd,其他村庄不管。但是这样做肯定会TLE。

想想怎么优化。注意到询问时 $ t_i $ 是递增的,村庄修建好的顺序也是递增的,那么我们可以记录一个当前修建好的村庄的最大编号。每次询问时,看是否有新的村庄修好了,如果有,那么把他加进来作为中转点跑一次最短路

AC代码

#include<bits/stdc++.h>
const int maxn=210;
using namespace std; int n,m,T[maxn];
int Q,np;
int dis[maxn][maxn]; int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&T[i]);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) if(i!=j)
dis[i][j]=INT_MAX/2;
for(int i=1;i<=m;i++)
{
int u,v,w;scanf("%d%d%d",&u,&v,&w);
u++;v++;
dis[u][v]=min(dis[u][v],w);
dis[v][u]=min(dis[v][u],w);
}
scanf("%d",&Q);
np=1;
for(int i=1;i<=Q;i++)
{
int u,v,t;scanf("%d%d%d",&u,&v,&t);
u++,v++;
for(np;T[np]<=t && np<=n;np++)
{
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][np]+dis[np][j]);
}
if(T[u]<=t && T[v]<=t && dis[u][v]!=INT_MAX/2) printf("%d\n",dis[u][v]);
else printf("-1\n");
}
return 0;
}

总结

优化的这一步可以说题目也提示了很多。如果题中没有给递增条件,也许我就不会做了。

洛谷 P1119 灾后重建 最短路+Floyd算法的更多相关文章

  1. 洛谷——P1119 灾后重建

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

  2. 洛谷 P1119 灾后重建——dijstra

    先上一波题目 https://www.luogu.org/problem/P1119 这道题我们可以将询问按时间排序 然后随着询问将相应已经重建成功的点进行操作 每次更新一个点就以他为起点跑一遍dij ...

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

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

  4. 洛谷P1119 灾后重建 Floyd + 离线

    https://www.luogu.org/problemnew/show/P1119 真是有故事的一题呢 半年前在宁夏做过一道类似的题,当时因为我的愚昧痛失了金牌. 要是现在去肯定稳稳的过,真是生不 ...

  5. 洛谷P1119灾后重建——Floyd

    题目:https://www.luogu.org/problemnew/show/P1119 N很小,考虑用Floyd: 因为t已经排好序,所以逐个加点,Floyd更新即可: 这也给我们一个启发,如果 ...

  6. 洛谷 P1119 灾后重建(Floyd)

    嗯... 题目链接:https://www.luogu.org/problem/P1119 这道题是一个Floyd的很好的题目,在Floyd的基础上加一点优化: 中转点k在这里不能暴力枚举,否则会超时 ...

  7. 洛谷 [P1119] 灾后重建

    我们发现每次询问都是对于任意两点的,所以这是一道多源最短路径的题,多源最短路径,我们首先想到floyd,因为询问的时间是不降的,所以对于每次询问,我们将还没有进行松弛操作的的点k操作. #includ ...

  8. 洛谷P1119灾后重建

    题目 做一个替我们首先要明确一下数据范围,n<=200,说明n^3的算法是可以过得,而且这个题很明显是一个图论题, 所以我们很容易想到这个题可以用folyd, 但是我在做这个题的时候因为没有深刻 ...

  9. 洛谷P1119 灾后重建

    传送门 题目大意:点被破坏,t[i]为第i个点修好的时间,且t[1]<t[2]<t[3].. 若干询问,按时间排序,询问第t时刻,u,v的最短路径长度. 题解:floyed 根据时间加入点 ...

随机推荐

  1. 此处有加速 apt-get github docker pull

    ubuntu get-apt 加速 创建 aptupdate.sh 脚本,内容为: #!/bin/bash mv /etc/apt/sources.list /etc/apt/sources.list ...

  2. WPF DataGrid 数据绑定之"List配合Dictionary"

    WPF 的DataGrid是WPF中最为强大的控件之一,可以通过各种方式绑定 例如通过最为形似的dataTable来绑定 本文则用List<Dictionary<K,V>>来绑 ...

  3. 什么情况下要加上【javascript:】

    你知道http:// https:// mailto: tencent://这种东西么?这叫url schema,通常是在a的href里的.但a的href里面是不能加脚本的,所以浏览器就创造了一个叫j ...

  4. PAT甲级——A1036 Boys vs Girls

    This time you are asked to tell the difference between the lowest grade of all the male students and ...

  5. day65——day69

    目录 DAY65 课堂笔记 1.vue实例 2.插值表达式 3.文本指令 4.面向对象js 5.js函数补充 6.事件指令 7.属性指令 DAY66 课堂笔记 1.表单指令 2.条件指令 3.循环指令 ...

  6. 2019-4-6-VisualStudio-编码规范工具-2.6-修改当前文件编码

    title author date CreateTime categories VisualStudio 编码规范工具 2.6 修改当前文件编码 lindexi 2019-04-06 15:31:53 ...

  7. Leetcode459.Repeated Substring Pattern重复的子字符串

    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000. 示例 1: 输入: "abab" 输出: True 解释 ...

  8. NoClassDefFoundError: Could not initialize class org.apache.cxf.jaxrs.provider.ProviderFactory org.springframework.aop.support.AopUtils.isCglibProxyClass

    报错: 2018-05-03 10:35:20 377 ERROR org.apache.juli.logging.DirectJDKLog.log:181 - Servlet.service() f ...

  9. 【转载】TSN简介及相关资源

    原文:https://blog.csdn.net/u012692537/article/details/86188392 一.简介 1.1 什么是TSN TSN(Time Sensitive Netw ...

  10. 【python之路28】模块python与excel

    一.可使用的第三方库 python中处理excel表格,常用的库有xlrd(读excel)表.xlwt(写excel)表.openpyxl(可读写excel表)等.xlrd读数据较大的excel表时效 ...