题解:洛谷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. Jenkins部署架构概述

    1.Jenkins是什么 Jenkins是一个开源的.提供友好操作界面的持续集成(CI)工具,起源于Hudson,主要用于持续.自动的构建/测试软件项目.监控外部任务的运行. Jenkins用Java ...

  2. plupload附件上传插件IE8问题

    前段时间遇到一个plupload上传插件问题,在其他浏览器上面运行很正常,但是就是在IE8上面第一次点击上传按钮无反应,后面再连续点击才ok.我的初始化代码如下 _this.uploader = ne ...

  3. 瑞芯微rk356x板子快速上手

    @ 目录 rk3568 CPU GPU NPU VPU 一.编译环境要求 二.编译前准备 0)开发板型号 1)安装第三方编译工具 2)设置adb路径 3)安装USB驱动DriverAssitant_v ...

  4. dfs剪枝与优化

    搜索树 剪枝方法 1.优化搜索顺序 2.排除等效冗余 3.可行性 4.最优性(估价) 5.记忆化(树形不会重复计算时不需要) A.针对每个维度边界信息缩放.推倒 B.计算未来最少花费 C.结合各维度的 ...

  5. 简单理解.net 依赖注入的三种方式

    前言 :.NET5.0 于2020年11月10日正式发布,它是3.1之后的 .NET Core 的下一个主要版本.微软将这个新版本命名为 .NET 5.0 而不是 .NET Core 4.0,其原因有 ...

  6. ptmalloc2涉及的基础知识与基本数据结构

    随笔来源:ctfwiki CSDN 本随笔只为记录分析总结的自己学习的结论,方便未来回顾,以及为他人提供一个理解的思路,不保证正确.如有谬误,请大家指出. 1.堆相关的操作 malloc:返回对应大小 ...

  7. KernelWarehouse:英特尔开源轻量级涨点神器,动态卷积核突破100+ | ICML 2024

    动态卷积学习n个静态卷积核的线性混合,加权使用它们输入相关的注意力,表现出比普通卷积更优越的性能.然而,它将卷积参数的数量增加了n倍,因此并不是参数高效的.这导致不能探索n>100的设置(比典型 ...

  8. C++ 模板(函数模板与类模板)

    模板 模板介绍 C++提供了函数模板(function template).所谓函数模板.实际上是建立一个通用函数,其函数类型和形参类型不具体制定,用一个虚拟的类型来代表.这个通用函数就称为函数模板. ...

  9. Vue3——Vue Router

    安装 vue-router 依赖包 npm install vue-router@4 创建 router 文件夹,然后在里面创建一个 index.ts 文件,用于定义你的路由配置 // index.t ...

  10. 使用阿里云 SpringBoot 仓库初始化项目

    本文基于:https://www.bilibili.com/video/BV15b4y1a7yG?p=5&vd_source=cf8900ba33d057d422c588abe5d5290d ...