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> # ...
随机推荐
- 春节无法线下社交聚会,来线上“一起X”共享体验
引语: 共享体验或许是全真互联网时代最显著的标志. 被疫情深刻改变的一年里,人们的社交关系和社交活动正在发生巨大的改变. 一方面,从线下转线上,我们能通过互联网连接更多的人,参与各种形式的社交活动,将 ...
- Hexo博客yilia主题添加背景音乐 (网易云音乐)
1. 打开网易云音乐首页,然后搜索你要添加的背景音乐 http://music.163.com/ 2. 搜索到歌曲点击生成外链播放器,进去下一个界面 3. 复制外链播放器的代码 打开yilia主题下的 ...
- JPA自动生成POJO
原文地址 JPA自动生成POJO 通过表生成POJO类 这篇文章不涉及idea配置数据源教程,该文章使用前提是用户已配置好idea数据源 修改自带的生成类 import com.intellij.da ...
- Django: request.GET.get()
释义 query = request.GET.get('name', '') 寻找名为name的GET参数,而且如果参数没有提交,返回一个空的字符串. 对比request.GET() 如果使用requ ...
- [mysql]状态检查常用SQL
前言 使用MySQL自身命令获取数据库服务状态. 连接数 -- 最大使用连接数 show status like 'Max_used_connections'; -- 系统配置的最大连接数 show ...
- Android OAID 获取 基于MSA oaid_sdk_1.0.25.zip
目录 简介 SDK下载 支持版本 开始使用 可能遇到的问题 替代方案 APK下载 写在最后 简介 本文链接:https://www.cnblogs.com/dks-/p/14357041.html 根 ...
- JNDI注入的本地搭建和分析
JNDI注入的本地搭建和分析 JNDI概述 JNDI(The java Naming and Directory Interface,java命名和目录接口)是一组在Java应用中访问命名和目录服 ...
- 「AntV」x6 框选添加右键菜单
今天在群里有个小伙伴提出了这么个问题:如何在框选完成后给框选的区域添加一个右键菜单的功能,我看到了这个问题后也是有点懵,心里想着怎么还有这个需求,直接快捷键删除不是更好吗,谁知这位小伙伴也是这么写的, ...
- 《CTFshow-Web入门》07. Web 61~70
@ 目录 web61~65 题解 web66 题解 原理 web67 题解 原理 web68 题解 原理 web69 题解 原理 web70 题解 原理 ctf - web入门 web61~65 题解 ...
- codeforces600E. Lomsat gelral(dsu on tree笔记)
知识前驱:树链剖分 codeforces600E. Lomsat gelral 题意:给出一个树,求出每个节点的子树中出现次数最多的颜色的编号和 分析:递归求解,对于一棵树,求出他的所有子树的颜色编号 ...