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在这里不能暴力枚举,否则会超时 ...
随机推荐
- ArcGIS创建渔网工具的使用方法
本文介绍在ArcMap软件中,通过"Create Fishnet"工具创建渔网,从而获得指定大小的矢量格网数据的方法. 首先,我们在创建渔网前,需要指定渔网覆盖的范围.这里 ...
- Go 接收命令行参数
在 Go 语言中,可以使用标准库中的 os 包和 flag 包来接收和处理命令行参数. 使用 os 包 os.Args 是一个字符串切片,其中第一个元素是程序的名称,后续元素是传递给程序的命令行参数. ...
- Make 使用
GNU Make 参考:Make 命令教程 | 阮一峰的网络日志 Makefile 文件的格式 Makefile 文件由一系列 规则(rules)构成.每条 规则 的形式如下. <target& ...
- 记 某List.sort()后排序结果异常
背景:某次查看日志,发现数据不符合预期,希望获取的是降序排序,但是部分数据是乱序的 已知List.sort()方法应该不会出异常,所以应该是判断先后方法出问题了 果然,因为一开始写代码时,没有考虑到差 ...
- SVG Video 声音图标灰色,无法点击
原因:Video里的视频放的是录屏,怪不得声音图标是灰色的 换成正常有声音的mp4文件,声音图标就正常了
- 1p-frac:已开源,仅用单张分形图片即可媲美ImageNet的预训练效果 | ECCV 2024
分形几何是一个数学分支,主要应用于作图方面.一般来说,分形经过无数次递归迭代后的结果.比如取一条线段,抹去中间的三分之一,会得到长度是原三分之一长的两条线段,中间隔着相同长度的间隙.然后重复这个动作, ...
- WiFi基础(三):802.11ac/ax/be 与 WiFi4、WiFi5、WiFi6、WiFi7
liwen01 2024.09.08 前言 经过二十多年的发展,WiFi 在硬件能力.软件和算法.频谱资源.市场需求.电源与能效方面都有了很大的提升.所以我们能看到从最开始只有几 M 速率的 802. ...
- pgsql 查询及更新json字段的某个属性
pgsql 查询及更新json字段的某个属性 一.查询json字段中的某个属性 查询 t_user 表中json 字段 info 中的 name 属性 select info ->> 'n ...
- [OI] 模拟退火
模拟退火是一种适合求样本点较大的多峰函数极值的方法. 模拟退火有几个参数:初始温度(\(T_{0}\)),终止温度(\(T_{e}\))和降温参数 \(d\),具体地,模拟退火是让每次的当前温度 \( ...
- android系统启动流程- ServiceManager进程启动流程
*注:基于Android11源码 ServiceManager进程是在init进程创建的,所以我们从init进程的main()开始分析: // 文件路径: system/core/init/main. ...