博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
P1119 灾后重建(floyd进阶)
阅读量:7215 次
发布时间:2019-06-29

本文共 1323 字,大约阅读时间需要 4 分钟。

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

代码如下

#include
using namespace std;const int maxn=1010;const int N=250;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=0;i
tt||t[yy]>tt) { printf("-1\n"); } else { printf("%d\n",f[xx][yy]); } } return 0;}

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

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

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

 

#include
using namespace std;const int maxn=1010;const int N=250;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 = 0 ; char ch = getchar() ; while(ch > '9' || ch < '0') ch = getchar() ; while(ch >= '0' && ch <= '9') X = (X << 1) + (X << 3) + (ch ^ 48), ch = getchar() ; return X ;}int main(){ n=Read(),m=Read(); for(int i=0;i
tt||t[yy]>tt) { printf("-1\n"); } else { printf("%d\n",f[xx][yy]); } } return 0;}

 

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

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

 

转载于:https://www.cnblogs.com/LJB666/p/10665886.html

你可能感兴趣的文章
js创建对象的几种方法
查看>>
浮点数杂想
查看>>
摧枯拉朽,说说ES6的三把火
查看>>
Java/Android基础-02
查看>>
nginx代理响应报文体不全解决思路
查看>>
前端性能优化 —— 项目瘦身
查看>>
全球人形机器人接连突破 拟人度越来越高
查看>>
vue按需加载
查看>>
创成汇2019年参加创新创业大赛都能获得什么?
查看>>
vue双向数据绑定原理
查看>>
美研究最新生物活性玻璃 可消灭致命的细菌
查看>>
内部类
查看>>
Vue中数组赋值问题
查看>>
APK path is not specified for module
查看>>
Linux运维宝典:最常用的150个命令汇总
查看>>
使用RecycleView实现无限滚动的日历
查看>>
Golang Failpoint 的设计与实现
查看>>
小微贷是美团的上坡之路?
查看>>
js 将线性数据转为树形
查看>>
java B2B2C 源码 多级分销Springcloud多租户电子商城系统- 整合企业架构的技术点(二)...
查看>>