floyd 算法——P1119 灾后重建
floyd 算法
是图论中较为简单的最短路算法,但在某些方面远超最短路范围。
算法思路
定义 \(f[x][y]\) 为 \(x\) 到 \(y\) 节点的最短路径。
初始化:若存在边 \((x,y)\) 则 \(f[x][y]\) 等于边长度;若不存在,为 \(+\infty\)。
特别的,\(f[x][x]=0\)。
我们考虑一下,\(x,y\) 这两个节点通过节点 \(k\) 来更新最短路径。
那么有 \(f[x][y]=\min(f[x][k]+f[k][y],f[x][y])\)。
比较好理解,就是到 \(k\) 的两条路径相加。
这时可能 \(f\) 数组还不是最短路径,但无伤大雅,后面我们会更新到。
比较草率,上代码吧。
for (k = 1; k <= n; k++) {
for (x = 1; x <= n; x++) {
for (y = 1; y <= n; y++) {
f[x][y] = min(f[x][y], f[x][k] + f[k][y]);
}
}
}
例题
思路
floyd 第一层 \(k\) 的循环的含义是通过前 \(k\) 个点可以转移到的最短路径。
我们将点按修复时间排序即可。
#include<bits/stdc++.h>
using namespace std;
const int maxm=1e5+5,maxn=205;
int n,m,q;
int dis[maxn][maxn],T[maxn];
pair<int,int>vex[maxm];
int now=0,k=1;
void fly()
{
for(;vex[k].first<=now&&k<=n;k++)
{
int K=vex[k].second;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(dis[i][K]+dis[j][K]<dis[i][j]) dis[i][j]=dis[j][i]=dis[i][K]+dis[j][K];
}
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<=n;i++) for(int j=0;j<=n;j++) dis[i][j]=1e9;
for(int i=1;i<=n;i++) scanf("%d",&vex[i].first),vex[i].second=i,dis[i][i]=0,T[i]=vex[i].first;
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
x++,y++;
dis[x][y]=dis[y][x]=z;
}
sort(vex+1,vex+n+1);
fly();
scanf("%d",&q);
while(q--)
{
int x,y,t;
scanf("%d%d%d",&x,&y,&t);
x++,y++;
if(T[x]>t||T[y]>t){printf("-1\n");continue;}
if(now<t)
{
now=t;
fly();
}
if(dis[x][y]==dis[0][0]) printf("-1\n");
else printf("%d\n",dis[x][y]);
}
}
floyd 算法——P1119 灾后重建的更多相关文章
- 洛谷 P1119 灾后重建 最短路+Floyd算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1119 灾后重建 题目描述 B地区在地震过后,所有村 ...
- [Luogu P1119] 灾后重建 (floyd)
题面 传送门:https://www.luogu.org/problemnew/show/P1119 Solution 这题的思想很巧妙. 首先,我们可以考虑一下最暴力的做法,对每个时刻的所有点都求一 ...
- 洛谷——P1119 灾后重建
P1119 灾后重建 题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重 ...
- P1119 灾后重建 floyd
题目背景 BB地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才 ...
- P1119 灾后重建(floyd进阶)
思路:这道题看n的范围很小(n<=200),显然就用floyd可以解决的问题,但又并不是简单的floyd算法,还是需要一些小小的变化.一开始我的思路是先跑一次弗洛伊德最短路,这样子显然复杂度很高 ...
- 洛谷P1119 灾后重建[Floyd]
题目背景 B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两个重建完成的村庄的公路才能 ...
- 洛谷P1119 灾后重建 Floyd + 离线
https://www.luogu.org/problemnew/show/P1119 真是有故事的一题呢 半年前在宁夏做过一道类似的题,当时因为我的愚昧痛失了金牌. 要是现在去肯定稳稳的过,真是生不 ...
- 洛谷P1119灾后重建——Floyd
题目:https://www.luogu.org/problemnew/show/P1119 N很小,考虑用Floyd: 因为t已经排好序,所以逐个加点,Floyd更新即可: 这也给我们一个启发,如果 ...
- Luogu P1119 灾后重建 【floyd】By cellur925
题目传送门 这道题我们很容易想到对于每次询问,都跑一遍最短路(spfa,虽然他已经死了).只需在松弛的时候加入当前相关的点是否已经修好的判断,果不其然的TLE了4个点. (然鹅我第一次用spfa跑的时 ...
- 洛谷 P1119 灾后重建(Floyd)
嗯... 题目链接:https://www.luogu.org/problem/P1119 这道题是一个Floyd的很好的题目,在Floyd的基础上加一点优化: 中转点k在这里不能暴力枚举,否则会超时 ...
随机推荐
- Ubuntu 16.04 部署Mariadb
默认上MariaDB的包并没有在Ubuntu仓库中.要安装MariaDB,我们要设置MariaDB仓库. sudo apt-get install software-properties-common ...
- win指令学习收集
要执行多句,需要用到逻辑判断 1 & 2 1成不成功都会执行2 1 && 2 1成功才会执行2 1 || 2 1不成功才会执行2
- 【Docker学习系列】Docker学习2-docker设置阿里云镜像加速器
在上一篇中,我们学会了在centos中安装docer.我们知道,镜像都是外网的,镜像一般都是比较大的,因为种种原因,我们知道,从外网下载比较慢的.所以,本文,凯哥就介绍怎么将docker的镜像拉取设置 ...
- 一文了解JSON
目录 JSON 在JavaScript 中的使用. json 的定义 json 的访问 json 的两个常用方法 JSON 在 在 java 中的使用 javaBean 和 和 json 的互转 Li ...
- 修改SpringBoot的配置文件application.yaml后启动失败
经常碰到修改application.yaml文件之后,SpringBoot项目启动失败的,报错信息如下 Connected to the target VM, address: '127.0.0.1: ...
- 小程序云开发 Collection.watch 监听器构建和销毁
小程序云开发 Collection.watch 监听器构建和销毁 构建和销毁代码示例 // release/chatroom/index.js const db = wx.cloud.database ...
- 浅谈 C# 中的顶级语句
前言 在C# 9版本中引入了一项新特性:顶级语句,这一特性允许在不显式定义 Main 方法的情况下直接编写代码. 传统的写法 namespace TestStatements{ internal ...
- RxJS 系列 – 实战练习
前言 这篇主要是给一些简单例子, 从中体会 RxJS 在管理上的思路. Slide Down Effect with Dynamic Content 我在这篇 CSS & JS Effect ...
- vue-i18n 8.28.2(完成)
https://kazupon.github.io/vue-i18n/zh/introduction.html 开始 如果使用模块系统 (例如通过 vue-cli),则需要导入 Vue 和 VueI1 ...
- DLA:动态层级注意力架构,实现特征图的持续动态刷新与交互 | IJCAI'24
论文深入探讨了层级注意力与一般注意力机制之间的区别,并指出现有的层级注意力方法是在静态特征图上实现层间交互的.这些静态层级注意力方法限制了层间上下文特征提取的能力.为了恢复注意力机制的动态上下文表示能 ...