题目链接

毒瘤题

卡spfa

可能dij也卡,没试过

然后放floyd过了

但其实spfa很好打,虽然只有60

让我们来分析一下spfa的效率,假设这个出题人极其毒瘤,出网格图

又因为是在线询问,所以对于每次询问都得跑一次spfa

所以效率上界为$O(n*m*Q)$

代入一下最坏情况,$200*19900*50000=199000000000$

嗯,1.99*(10^11),成功炸飞

但是spfa特别好想也特别好打

在松弛的时候多判一下$if(t[u]>T||t[v]>T)continue$就好

其他都是标准spfa操作

题目中给的t是有序的,如果是无序的需要离线处理排序一下

Code(spfa):

#include <cstdio>
#include <cstring>
using namespace std;
#define N 80000
#define inf (1<<30)
int n,m,t[N];
int cnt,head[N];
int d[N],q[N];
bool vis[N];
struct edge{int to,next,v;}e[N<<];
void ins(int u,int v,int w){
e[++cnt].to=v;e[cnt].next=head[u];e[cnt].v=w;head[u]=cnt;
e[++cnt].to=u;e[cnt].next=head[v];e[cnt].v=w;head[v]=cnt;
}
bool spfa(int s,int ttt,int tt){
for(int i=;i<=n;i++)d[i]=inf;
memset(vis,,sizeof(vis));
int l=,r=;
d[s]=;q[]=s;vis[s]=;
while(l<r){
int u=q[l++];
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(t[u]>tt||t[v]>tt)continue;
if(d[v]>d[u]+e[i].v){
d[v]=d[u]+e[i].v;
if(!vis[v])vis[v]=,q[r++]=v;
}
}
vis[u]=;
}
if(d[ttt]==inf)return ;
return ;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&t[i]);
for(int i=;i<=m;i++){
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
x++;y++;
ins(x,y,w);
}
int Q;
scanf("%d",&Q);
while(Q--){
int x,y,T;
scanf("%d%d%d",&x,&y,&T);
if(spfa(x+,y+,T))printf("%d\n",d[y+]);
else printf("-1\n");
}
return ;
}

好了接下来上正解

观察到t和每个询问里面的T是有序的

所以对于每个询问的T我们只要松弛已经修好的村庄就好了

然后如果出发点/终点还没修好那么肯定也没法到,特判一下

注意要建无向边

其实floyd比spfa还好打(雾)

Code(floyd):

#include <cstdio>
#include <cstring>
using namespace std;
#define inf 0x3f3f3f3f
int f[][],t[],n,m,k;
int min(int x,int y){return x<y?x:y;}
int main(){
scanf("%d%d",&n,&m);
memset(f,0x3f,sizeof(f));
for(int i=;i<n;i++)
scanf("%d",&t[i]),f[i][i]=;
for(int i=;i<m;i++){
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
f[x][y]=f[y][x]=w;
}
int Q;
scanf("%d",&Q);
while(Q--){
int x,y,w;
scanf("%d%d%d",&x,&y,&w);
while(t[k]<=w&&k<=n){
for(int i=;i<n;i++)
for(int j=;j<n;j++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
k++;
}
if(f[x][y]==inf||t[x]>w||t[y]>w)printf("-1\n");
else printf("%d\n",f[x][y]);
}
return ;
}

[luoguP1119]灾后重建的更多相关文章

  1. [luoguP1119] 灾后重建(Floyd)

    传送门 基于Floyd的动态规划原理,我们可以只用进行一次Floyd. 而题目给出的限制条件相当于给Floyd加了时间限制而已. 还是得靠对Floyd的理解. ——代码 #include <cs ...

  2. CODEVS 1817 灾后重建 Label:Floyd || 最短瓶颈路

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

  3. AC日记——灾后重建 洛谷 P1119

    灾后重建 思路: 看到n<=200,思考弗洛伊德算法: 如何floyed呢? floyed是一种动态规划求最短路的算法: 它通过枚举中间点来更新两点之间最短路: 回到这个题本身: 所有点的重建完 ...

  4. 洛谷——P1119 灾后重建

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

  5. 【洛谷P1119题解】灾后重建——(floyd)

    这道题告诉我,背的掉板子并不能解决一切问题,理解思想才是关键,比如不看题解,我确实想不清楚这题是弗洛伊德求最短路 (我不该自不量力的说我会弗洛伊德了我错了做人果然要谦虚) 灾后重建 题目背景 B地区在 ...

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

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

  7. java实现第六届蓝桥杯灾后重建

    灾后重建 题目描述 Pear市一共有N(<=50000)个居民点,居民点之间有M(<=200000)条双向道路相连.这些居民点两两之间都可以通过双向道路到达.这种情况一直持续到最近,一次严 ...

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

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

  9. 【u110】灾后重建

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前, ...

随机推荐

  1. Socket通信的Python实现

    Python中实现socket通信,socket通信的服务端比较复杂,而客户端非常简单,所以客户端基本上都是用sockct模块实现,而服务 端用有很多模块可以使用.下面就说一下服务端可使用的模块. 模 ...

  2. MySQL事务隔离级别详解(转)

    原文: http://xm-king.iteye.com/blog/770721 SQL标准对事务定义了4种隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的.低级别的隔 ...

  3. JS模块化编程(五)---按照AMD规范扩展全局对象

    采用AMD规范 具体来说,就是模块必须采用特定的define()函数来定义;如果一个模块不依赖其他模块,那么可以直接定义在define()函数中; 以扩展全局对象Date为例: define(func ...

  4. 发现XMind一个超级牛逼的功能

    本来想要自己手动建立下文件夹的结构图,一不小心发现了一个大惊喜. 比如想要看一下360Downloads文件夹下的文件结构,可以先创建一个名叫360Downloads的主节点,然后把其文件夹下的文件直 ...

  5. 学习Spark2.0中的Structured Streaming(一)

    转载自:http://lxw1234.com/archives/2016/10/772.htm Spark2.0新增了Structured Streaming,它是基于SparkSQL构建的可扩展和容 ...

  6. [py]django模板继承

    参考 1.展示arr,d等数据类型 2.逻辑for if / url获取 3.获取内置变量 django模板继承 通过搞一个base.html 这个base.html可以包含两类 block片断 其他 ...

  7. 机器学习理论基础学习14.1---线性动态系统-卡曼滤波 Kalman filter

    一.背景 动态模型 = 图 + 时间 动态模型有三种:HMM.线性动态系统(kalman filter).particle filter 线性动态系统与HMM的区别是假设相邻隐变量之间满足线性高斯分布 ...

  8. html5<embed>的完整属性

    问题起因:网页中插入Flash,看了代码,然后呢,小小的学习下 <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000& ...

  9. 关于VS2010的帮助文档更改路径

    不小心把MSDN装在系统盘怎么办? 由于自己的C盘空间比较有限,所以经常需要把软件安装在其他磁盘,比如E盘,但是这次重装却不小心就装在C盘了,特遗憾,偶然在网上找到可以更改路径的方法,自己试试,成功了 ...

  10. python chunk模块

    chunk模块用于读取TIFF格式的文件,打开应该使用二进制模式 TIFF 标签图像文件格式 import chunk import chunk f=open('E:\\test.tiff','rb' ...