思路:这道题看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. 《HelloGitHub》第 31 期

    公告 网站新增了 Web 服务器排行榜.数据库排行榜 <HelloGitHub>第 31 期 兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣 ...

  2. springboot~hazelcast缓存中间件

    缓存来了 在dotnet平台有自己的缓存框架,在java springboot里当然了集成了很多,而且缓存的中间件也可以进行多种选择,向redis, hazelcast都是分布式的缓存中间件,今天主要 ...

  3. SLAM+语音机器人DIY系列:(三)感知与大脑——5.机器人大脑嵌入式主板性能对比

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...

  4. 用python写一个北京市的个税计算器

    #应纳税的钱:税前收入-5000元(起征点)-专项扣除(五险一金等) #工资个税的计算公式为: #个人所得税=应纳税的钱×适用税率-速算扣除数 ''' 1.全月应纳税所得额不超过3000元: 税率:3 ...

  5. SpringMVC之入门程序

    SpringMVC之入门程序——使用浏览器展示商品数据 springMVC执行流程(图片来源:https://www.jianshu.com/p/8a20c547e245) 1.创建pojo(商品实体 ...

  6. vue路由懒加载 及import

  7. Spring boot项目maven的profile多环境配置不自动替换变量的问题解决

    Spring boot项目maven的profile多环境配置不自动替换变量的问题解决   在网上找了好久,配置都很简单,可是我的程序就是不能自动替换变量,最终单独测试,发现原来是引用spring b ...

  8. vmware完整克隆(linux)

    vmware中的完整克隆是基于指定的虚拟机克隆出相同的一份出来,不必再安装 但是我们要保证三个地方不能一样,一个是主机名称(hostname),一个是虚拟网卡设备mac地址,还有一个是ip地址 所以我 ...

  9. 基于hadoop分析,了解hive的使用

    一.Hadoop理论 Hadoop是一个专为离线和大规模数据分析而设计的,并不适合那种对几个记录随机读写的在线事务处理模式. Hadoop=HDFS(文件系统,数据存储技术相关)+ Mapreduce ...

  10. Android为TV端助力 转载:RecyclerView分页加载

    package com.android.ryane.pulltoloaddata_recyclerview; import android.os.Handler;import android.os.L ...