思路:这道题看n的范围很小(n<=200),显然就用floyd可以解决的问题,但又并不是简单的floyd算法,还是需要一些小小的变化。一开始我的思路是先跑一次弗洛伊德最短路,这样子显然复杂度很高,并且题目中的路径长度是时刻可能更新的,所以我们应该在修建的时候再跑最短路。可以用一个变量来记录修改的点,这样子就可以大幅度的优化。

代码如下

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
const int N=;
int n,m,x,y,v,T;
int t[maxn];
int f[N][N];
int flag[N][N];
int xx,yy,tt;
int start;//动态变化的那个点
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
{
scanf("%d",&t[i]);
f[i][i]=;
}
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
f[i][j]=1e9;
}
}
for(int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&v);
f[x][y]=f[y][x]=v;
}
scanf("%d",&T);
for(int o=;o<=T;o++)
{
start=;//Tle原因
scanf("%d%d%d",&xx,&yy,&tt);
while(t[start]<=tt&&start<n)
{
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
f[i][j]=min(f[i][start]+f[start][j],f[i][j]);
}
}
start++;
}
if(f[xx][yy]==1e9||t[xx]>tt||t[yy]>tt)
{
printf("-1\n");
}
else
{
printf("%d\n",f[xx][yy]);
}
}
return ;
}

等等,但这样似乎只有30分,吸氧50 ,T了7个点

究其原因,是因为每次跑弗洛伊德的时候,start都是又从零开始枚举的,这样显然是没有必要的

所以我们就将他简单改一下

#include<bits/stdc++.h>
using namespace std;
const int maxn=;
const int N=;
int n,m,x,y,v,T;
int t[maxn];
int f[N][N];
int flag[N][N];
int xx,yy,tt;
int start;
int Read(){
int X = ; char ch = getchar() ;
while(ch > '' || ch < '') ch = getchar() ;
while(ch >= '' && ch <= '')
X = (X << ) + (X << ) + (ch ^ ), ch = getchar() ;
return X ;
}
int main()
{
n=Read(),m=Read();
for(int i=;i<n;i++)
{
t[i]=Read();
f[i][i]=;
}
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
f[i][j]=1e9;
}
}
for(int i=;i<=m;i++)
{
x=Read();
y=Read();
v=Read();
f[x][y]=f[y][x]=v;
}
T=Read();
for(int o=;o<=T;o++)
{
xx=Read(),yy=Read(),tt=Read();
while(t[start]<=tt&&start<n)
{
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
f[i][j]=min(f[i][start]+f[start][j],f[i][j]);
}
}
start++;
}
if(f[xx][yy]==1e9||t[xx]>tt||t[yy]>tt)
{
printf("-1\n");
}
else
{
printf("%d\n",f[xx][yy]);
}
}
return ;
}

因为修建的时候那个点都是一遍更新的,并且时间是单调递增的

所以只需要更新一遍就得了,那个动态的点就不用再次清零了。

P1119 灾后重建(floyd进阶)的更多相关文章

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

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

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

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

  3. P1119 灾后重建 floyd

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

  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算法

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

  7. 洛谷——P1119 灾后重建

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

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

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

  9. Luogu P1119 灾后重建 【floyd】By cellur925

    题目传送门 这道题我们很容易想到对于每次询问,都跑一遍最短路(spfa,虽然他已经死了).只需在松弛的时候加入当前相关的点是否已经修好的判断,果不其然的TLE了4个点. (然鹅我第一次用spfa跑的时 ...

随机推荐

  1. 使用 ASP.NET Core MVC 创建 Web API(四)

    使用 ASP.NET Core MVC 创建 Web API 使用 ASP.NET Core MVC 创建 Web API(一) 使用 ASP.NET Core MVC 创建 Web API(二) 使 ...

  2. 云HBase发布全文索引服务,轻松应对复杂查询

    云HBase发布了“全文索引服务”功能,自2019年01月25日后创建的云HBase实例,可以在控制台免费开启此“全文索引服务”功能.使用此功能可以让用户在HBase之上构建功能更丰富的搜索业务,不再 ...

  3. WebForm+一般处理程序+Ajax聊天

    #### 很容易理解 插入数据 到数据库 在使用 setInterval() 读取数据 显示在 页面中 好了 不废话 直接上代码 不会的 可以加我 微信 Jth11163## 效果图片 ![在这里插入 ...

  4. [TCP/IP] 网络层-抓包分析IP数据包首部

    ip数据包的结构:首部+数据部分 1.版本(v4或者v6)+首部长度(固定的20字节,所以就没有)+区分服务优先级(我的例子是 assured forwarding 31 0x1a 26,保证转发) ...

  5. 日志分析工具Log Parser介绍

    摘要: 微软动态CRM专家罗勇 ,回复321或者20190322可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me! 分析Dynamics 365 Customer Enga ...

  6. 电脑获取手机文件的一种方式(通过手机建立ftp)

    1 打开手机热点. 2 手机需要安装es文件浏览器,在es浏览器首页有个远程管理(或在左侧网络功能下有个远程管理),打开即可启用手机目录下的ftp. 3 打开电脑按提示输入ftp站点.默认地址是手机热 ...

  7. Java 基于ArcFace人脸识别2.0 服务端Demo

    源代码传送:https://github.com/itboyst/ArcSoftFaceDemo 开发环境准备: ###开发使用到的软件和工具: Jdk8.mysql5.7.libarcsoft_fa ...

  8. 使用GDB调试Android Native 层代码

    --------------步骤:0. adb root0. adb shell0. ps | grep browser1. gdbserver :5039 --attach pid2. adb fo ...

  9. 如何快速清理 docker 资源

    如果经常使用 docker,你会发现 docker 占用的资源膨胀很快,其中最明显也最容易被察觉的应该是对磁盘空间的占用.本文将介绍如何快速的清理 docker 占用的系统资源,具体点说就是删除那些无 ...

  10. promise原理

      简介 Promise 对象用于延迟(deferred) 计算和异步(asynchronous )计算.一个Promise对象代表着一个还未完成,但预期将来会完成的操作.Promise 对象是一个返 ...