P1119 floyd
最开始看错数据了没看到Q = 100 是50%的数据以为跑q遍floyd能过,结果只有30,其他全t
1、要注意题目中的条件,挖掘一些性质
2、本题的另一个关键的是要对floyd的过程原理比较熟悉,floyd一共有三重循环,第一重循环相当于枚举的决策,也就是能从那个点转移过来,k就是这个中转站,另外两重循环是枚举的状态
3、我们观察到每个村庄的重建时间是递增的,并且询问的时间也是递增或保持不变,所以我们可以在读入每个询问的时间时,看一下是否存在中转站,在这个时间已经建好,并且可以去更新其他点,我们找到所以这样的点去更新,然后cur不用回去,因为询问的时间也是递增的,只需要在读入下一个询问后,查看是否有新的中转点可以去更新其他点即可。
4、经过上面的分析我们可以知道我们只需要跑一遍floyd即可,因为只有满足的中转点才会被用,时间复杂度为O(n^3)
附上floyd的板子
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 210, INF = 1e9;
int n, m, Q;
int d[N][N];
void Floyd()
{
for(int k = 1; k <= n; k ++)
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
//要取一下最小值这个写的时候老是忘记
d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
}
int main()
{
cin >> n >> m >> Q;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
if(i == j) d[i][j] = 0;
else d[i][j] = INF;
for(int i = 0; i < m; i ++)
{
int a, b, w; cin >> a >> b >> w;
d[a][b] = min(d[a][b], w);
}
Floyd();
while(Q --)
{
int a, b; cin >> a >> b;
if(d[a][b] > INF / 2) puts("impossible");
else cout << d[a][b]<<endl;;
}
return 0;
}
灾后重建
题目背景
B 地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响。但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车。换句话说,只有连接着两个重建完成的村庄的公路才能通车,只能到达重建完成的村庄。
题目描述
给出 B 地区的村庄数 \(N\),村庄编号从 \(0\) 到 \(N-1\),和所有 \(M\) 条公路的长度,公路是双向的。并给出第 \(i\) 个村庄重建完成的时间 \(t_i\),你可以认为是同时开始重建并在第 \(t_i\) 天重建完成,并且在当天即可通车。若 \(t_i\) 为 \(0\) 则说明地震未对此地区造成损坏,一开始就可以通车。之后有 \(Q\) 个询问 \((x,y,t)\),对于每个询问你要回答在第 \(t\) 天,从村庄 \(x\) 到村庄 \(y\) 的最短路径长度为多少。如果无法找到从 \(x\) 村庄到 \(y\) 村庄的路径,经过若干个已重建完成的村庄,或者村庄 \(x\) 或村庄 \(y\) 在第 \(t\) 天仍未重建完成,则需要返回 -1。
输入格式
第一行包含两个正整数\(N,M\),表示了村庄的数目与公路的数量。
第二行包含\(N\)个非负整数\(t_0, t_1,…, t_{N-1}\),表示了每个村庄重建完成的时间,数据保证了\(t_0 ≤ t_1 ≤ … ≤ t_{N-1}\)。
接下来\(M\)行,每行\(3\)个非负整数\(i, j, w\),\(w\)为不超过\(10000\)的正整数,表示了有一条连接村庄\(i\)与村庄\(j\)的道路,长度为\(w\),保证\(i≠j\),且对于任意一对村庄只会存在一条道路。
接下来一行也就是\(M+3\)行包含一个正整数\(Q\),表示\(Q\)个询问。
接下来\(Q\)行,每行\(3\)个非负整数\(x, y, t\),询问在第\(t\)天,从村庄\(x\)到村庄\(y\)的最短路径长度为多少,数据保证了\(t\)是不下降的。
输出格式
共\(Q\)行,对每一个询问\((x, y, t)\)输出对应的答案,即在第\(t\)天,从村庄\(x\)到村庄\(y\)的最短路径长度为多少。如果在第t天无法找到从\(x\)村庄到\(y\)村庄的路径,经过若干个已重建完成的村庄,或者村庄x或村庄\(y\)在第\(t\)天仍未修复完成,则输出\(-1\)。
样例 #1
样例输入 #1
4 5
1 2 3 4
0 2 1
2 3 1
3 1 2
2 1 4
0 3 5
4
2 0 2
0 1 2
0 1 3
0 1 4
样例输出 #1
-1
-1
5
4
提示
对于\(30\%\)的数据,有\(N≤50\);
对于\(30\%\)的数据,有\(t_i= 0\),其中有\(20\%\)的数据有\(t_i = 0\)且\(N>50\);
对于\(50\%\)的数据,有\(Q≤100\);
对于\(100\%\)的数据,有\(N≤200\),\(M≤N \times (N-1)/2\),\(Q≤50000\),所有输入数据涉及整数均不超过\(100000\)。
#include <iostream>
#include <cstring>
using namespace std;
const int N = 210, INF = 2e9;
long long d[N][N], a[N];
bool st[N];
int n, m;
inline void floyd(int k)
{
for(int i = 0; i < n; ++ i)
for(int j = 0; j < n; ++ j)
if(d[i][j] > d[i][k] + d[k][j])
d[i][j] = d[i][k] + d[k][j];
}
int main()
{
// freopen("1.in.txt", "r", stdin);
cin >> n >> m;
for(int i = 0; i < n; ++ i) cin >> a[i];
for(int i = 0; i < n; ++ i)
for(int j = 0; j < n; ++ j)
{
if(i == j) d[i][i] = 0;
d[i][j] = INF;
}
for(int k = 0; k < m; ++ k)
{
int a, b ,c; cin >> a >> b >> c;
d[a][b] = d[b][a] = c;
}
int q, cur = 0;cin >> q;
while(q --)
{
int x, y, t; cin >> x >> y >> t;
while(a[cur] <= t && cur < n)
{
floyd(cur);
cur ++;
}
if(a[x] > t || a[y] > t || d[x][y] == INF) cout << -1 << endl;
else cout << d[x][y] << endl;
}
return 0;
}
P1119 floyd的更多相关文章
- 洛谷P1119 灾后重建 Floyd + 离线
https://www.luogu.org/problemnew/show/P1119 真是有故事的一题呢 半年前在宁夏做过一道类似的题,当时因为我的愚昧痛失了金牌. 要是现在去肯定稳稳的过,真是生不 ...
- 洛谷P1119灾后重建——Floyd
题目:https://www.luogu.org/problemnew/show/P1119 N很小,考虑用Floyd: 因为t已经排好序,所以逐个加点,Floyd更新即可: 这也给我们一个启发,如果 ...
- 洛谷 P1119 灾后重建 最短路+Floyd算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1119 灾后重建 题目描述 B地区在地震过后,所有村 ...
- 洛谷 P1119 灾后重建(Floyd)
嗯... 题目链接:https://www.luogu.org/problem/P1119 这道题是一个Floyd的很好的题目,在Floyd的基础上加一点优化: 中转点k在这里不能暴力枚举,否则会超时 ...
- [Luogu P1119] 灾后重建 (floyd)
题面 传送门:https://www.luogu.org/problemnew/show/P1119 Solution 这题的思想很巧妙. 首先,我们可以考虑一下最暴力的做法,对每个时刻的所有点都求一 ...
- 洛谷P1119 灾后重建[Floyd]
题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...
- P1119 灾后重建(floyd进阶)
思路:这道题看n的范围很小(n<=200),显然就用floyd可以解决的问题,但又并不是简单的floyd算法,还是需要一些小小的变化.一开始我的思路是先跑一次弗洛伊德最短路,这样子显然复杂度很高 ...
- P1119 灾后重建 floyd
题目背景 BB地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才 ...
- Luogu P1119 灾后重建 【floyd】By cellur925
题目传送门 这道题我们很容易想到对于每次询问,都跑一遍最短路(spfa,虽然他已经死了).只需在松弛的时候加入当前相关的点是否已经修好的判断,果不其然的TLE了4个点. (然鹅我第一次用spfa跑的时 ...
- 【Luogu】P1119灾后重建(Floyd)
题目链接 见题解: feilongz. 这里只放代码. #include<cstdio> #include<cstring> #include<cstdlib> # ...
随机推荐
- 分布式多协议接入网关FluxMQ-2.0功能说明
FluxMQ-2.0版本更新内容 前言 FLuxMQ是一款基于java开发,支持无限设备连接的云原生分布式物联网接入平台.FluxMQ基于Netty开发,底层采用Reactor3反应堆模型,具备低延迟 ...
- 给程序员准备的“蜜糍”--SOD框架简介
注:本文是SOD框架源码仓库的首页介绍,原文地址 一.框架介绍 1,SOD框架是什么? 以前有一个著名的国产化妆品"大宝SOD密",SOD框架虽然跟它没有什么关系,但是名字的确受到 ...
- java学习中的一些总结
最近java要考试了,在复习的时候就发现什么成员变量,成员函数,静态,非静态,里面的一些东西都乱七八糟的(其实是我太菜了,没有理解透彻) 我查了很多相关的资料,网上很多大佬总结的非常好 知识点一 成员 ...
- 用字符串表达式执行引擎消除掉if else if
背景 最近我搞了个微信机器人,@机器人 xxx 这样来发送命令 能拿到的信息有,消息内容,消息发送人,消息所在的群id等 需要根据消息内容或者消息发送群id等不同的条件组合来决定走哪个处理逻辑. 简单 ...
- 【NestJS系列】DI依赖注入与IOC控制反转
前言 上篇文章我们学习了如何使用nest-cli来快速生成一个NestJS后端项目,当我们打开编辑器查看代码时,会发现整个代码风格有点类似JAVA的spring框架,并且你会发现一些service类在 ...
- Python单元测试之道:从入门到精通的全面指南
在这篇文章中,我们会深入探讨Python单元测试的各个方面,包括它的基本概念.基础知识.实践方法.高级话题,如何在实际项目中进行单元测试,单元测试的最佳实践,以及一些有用的工具和资源 一.单元测试重要 ...
- VueJs禁止页面鼠标右键、选中、调用开发者工具
1.禁止鼠标右键操作 // 禁止鼠标右键 window.oncontextmenu = function () { return false; }; 2.禁止选中网页内容 // 禁止选中网页上内容 w ...
- CobaltStrike4.8--云服务器搭建
系统版本选用 选择最熟悉的版本,我这边用的CentOS7.8,选用乌班图的话,会有一些命令的不一致 配置运行环境 CobaltStrike4.0支持jdk1.8的环境,4.5开始就不支持1.8了,本文 ...
- [爬虫]1.2.1 HTML标签和属性
HTML(HyperText Markup Language)是一种用于创建网页的标记语言.HTML文档由一系列的HTML标签构成,每个标签都有自己的意义和用途.HTML标签通常成对出现,由一个开始标 ...
- 虚拟化学习:vps和云计算的区别
1 vps 可以由虚拟机实现,但并不是虚拟机; 虚拟机是云计算的核心,但虚拟机也不等于云主机. 2 vps是面向单台服务器的虚拟化技术,服务器挂了,其上的vps也跟着挂了. 3 云计算是面向服务器集群 ...