题解:洛谷P1119 灾后重建

题目传送门

前言:没有掌握floyed求最短路的精髓是每次增加选一个中转点,导致写了2h才勉强卡过

法1:最暴力的想法就是开个三维数组把前i个点的dis状态全部存下来,跑N次floyed,当然由于每次点数时递增的,所以实际复杂度远远小于O(N^4),算了下大概200个点跑了4e8多一点点,卡卡常开O2还是能过(不吸氧只有40,逃)

#include<bits/stdc++.h>
#define ri register int
#define F(i,l,r) for(ri i=l;i<=r;++i)
using namespace std;
char buf[1<<19],*p1=buf,*p2=buf;
inline int gc(){ return (p1==p2)&&(p2=(p1=buf)+fread(buf,1,1<<19,stdin),p1==p2)?EOF:*p1++; }
inline int rd(){
ri x=0; char ch=gc();
while(!isdigit(ch)) ch=gc();
while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=gc();
return x;
}
const int inf=0x3f3f3f3f;
int n,m,q,t[205],g[100003],dis[202][202][202];//g[i]:t=i时的点数
inline void ini(){
memset(dis,0x3f,sizeof(dis)); F(i,0,n-1) F(j,0,n-1) dis[j][j][i]=0;
F(i,1,n-2) F(j,t[i],t[i+1]-1) g[j]=i;
F(i,0,t[0]-1) g[i]=-1; F(i,t[n-1],100000) g[i]=n-1;
}
int main(){
// freopen("a.in","r",stdin);
// freopen("a.out","w",stdout);
int u,v,ti; n=rd(),m=rd(); F(i,0,n-1) t[i]=rd();
ini();
F(i,1,m) u=rd(),v=rd(),ti=rd(),dis[u][v][0]=ti,dis[v][u][0]=ti;
F(p,0,n-1){
if(p>0) F(i,0,n-1) F(j,0,n-1) dis[i][j][p]=dis[i][j][p-1];
F(k,0,p) F(i,0,p) F(j,0,p) dis[i][j][p]=min(dis[i][k][p]+dis[k][j][p],dis[i][j][p]);
}
q=rd(); while(q--){
u=rd(),v=rd(),ti=rd();
if(g[ti]<0 || u>g[ti] || v>g[ti] || dis[u][v][g[ti]]==inf) puts("-1");
else printf("%d\n",dis[u][v][g[ti]]);
}
return 0;
}

法2:

1.留意到法1中的做法其实很浪费:第p轮更新却要把前p-1轮重复的再算一遍,能不能优化呢?

2.发现每次随时间新加进来点k后,可能被改变的dis其实只有过了k点的dis,我们惊讶地发现这不就是以k为中转站去更新dis吗?前k-1个点作为中转站的dis是不受影响的。所以每次询问都把当前 t 新修好的点加入最短路更新 dis 即可,不用每次重新算。

3.再结合floyed的本质:外层k的累加,代表着允许前1个点作为中转站,前2个点,前3个点...前k个点来更新dis状态, 用一句话概括就是:从i号顶点到j号顶点只经过前k号点的最短路程。

4.题上询问的t又是递增的,所以在线加点没有问题,这样dis只用开两维,时间复杂度O(N^3)

...
inline void upd(int k){
F(i,0,n-1) F(j,0,n-1) dis[i][j]=min(dis[i][k]+dis[k][j],dis[i][j]);
}
int main(){
...
int nw=0;
q=rd(); while(q--){
u=rd(),v=rd(),ti=rd();
while(t[nw]<=ti && nw<n) upd(nw++);
if(t[u]>ti || t[v]>ti || dis[u][v]==inf) puts("-1");
else printf("%d\n",dis[u][v]);
}
}

题解:洛谷P1119 灾后重建的更多相关文章

  1. 洛谷——P1119 灾后重建

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

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

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

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

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

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

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

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

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

  6. 洛谷P1119 灾后重建

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

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

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

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

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

  9. 洛谷 [P1119] 灾后重建

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

  10. 洛谷P1119灾后重建

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

随机推荐

  1. quartz监控日志(四)自定义QuartzJobBean来实现监控

    quartz监控日志(一) quartz监控日志(二)添加监听器 quartz监控日志(三)查看卡死线程堆栈 上面几章介绍了quartz监控的几种方式,下面再介绍一种监听方式:自定义QuartzJob ...

  2. python中怎样指定open编码为ansi

    在Python中,当使用open函数打开文件时,可以通过encoding参数来指定文件的编码方式.然而,需要注意的是,Python标准库中的编码并不直接支持名为"ANSI"的编码, ...

  3. 12米空间分辨率DEM数据申请下载:TanDEM-X数据集

      本文介绍全球12米与30米高空间分辨率的数字高程模型(DEM)数据--TanDEM-X数据的下载申请方法.   Tandem-X卫星项目于2010年6月启动,并于2010年6月21日和2010年1 ...

  4. Https通信的SSL证书工作流程原理(转)

    前言 浏览器与服务器之间的https加密通信会包括以下一些概念:非对称加密.对称加密.RSA.证书申请.根证书.https证书加密,就是在传输层tcp和应用层http之间加了一层ssl层来对传输内容进 ...

  5. mysql bit(1) 字段insert 报错 Data too long

    insert数据时,给bit(1)字段赋值 '1' 报错 将字符串'1',修改为数字1即可

  6. RuleLinKClient - 再也不担心表达引擎宕机了

    原来有这么多时间 六月的那么一天,天气比以往时候都更凉爽,媳妇边收拾桌子,边漫不经心的对我说:你最近好像都没怎么阅读了. 正刷着新闻我,如同被一记响亮的晴空霹雳击中一般,不知所措.是了,最近几月诸事凑 ...

  7. 《SpringCloud微服务之间相互调用》之Feign实战

    一.场景再现 假设我们有这样一个场景: 用户付款成功后,扣除用户金额,还要减少仓库数量.按照微服务的设计理念,用户具有至少以下3个服务(项目): 1.订单 2.账户 3.仓库 微服务之间都是相互独立的 ...

  8. 合合信息推出国央企智能文档处理解决方案,AI赋能信创国产化

    信息时代,数字化转型已成为推动经济高质量发展的关键力量.国央企是国民经济的重要支柱,其数字化转型进程关乎着自身与产业链上下游企业的共同发展.文档的智能化处理可有效提升信息流转的效率.促进知识的沉淀与传 ...

  9. Flutter Web 近期的重要更新

    我们的发布重点优先关注在性能.开发者体验以及 Web 集成上 2021 年 3 月 Flutter Web 支持已进入稳定版,那么,下一步是什么? 我们对用户研究发现,有超过 10% 的 Flutte ...

  10. CSP提高组模拟1

    我的微軟輸入法莫名其妙變成繁體了,你們有什麽頭緒嗎 狀態 題目 20 Time Exceeded A 最短路 25 Time Exceeded B 方格取数 0 Time Exceeded C 数组 ...