洛谷1613 跑路 倍增 + Floyd
首先,我们一定要认识到本题中的最短时间所对应的道路不一定是在起点到终点的最短路。例如,起点到终点的最短路为 151515 ,那么对 151515 进行二进制拆分的话是 111111111111 ,这时求出的最短时间为4。然而如果有一条长度为 161616 的路径的话最短时间就为 111,显然比之前求的更优 。
我们在这里定义两个数组:
- intintint d[i][j]d[i][j]d[i][j],即代表点 (i,j)(i,j)(i,j) 之间的最短跑步时间。
- boolboolbool g[i][j][k]g[i][j][k]g[i][j][k],它代表的是点 (i,j)(i,j)(i,j) 之间是否有一条跑步时间为 2k2^k2k 的一条道路。
我们对 g[i][j][k]g[i][j][k]g[i][j][k] 运行一遍 FloydFloydFloyd 来更新。
更新方程是:
if(g[i][k][log−1]if(g[i][k][log-1]if(g[i][k][log−1] && g[k][j][log−1])g[k][j][log-1])g[k][j][log−1]) g[i][j][log]=1g[i][j][log]=1g[i][j][log]=1 ,d[i][j]=1d[i][j]=1d[i][j]=1.
显然,我们处理完 ggg 数组后所有可以在一秒之内到达的点对都已处理完毕。于是我们在图上对 d[i][j]d[i][j]d[i][j] 再跑一遍 FloydFloydFloyd 即可。
时间复杂度为 O(n3logm)O(n^3logm)O(n3logm)。
#include<cstdio>
#include<algorithm>
using namespace std;
const int logn = 60;
const int maxm = 500000 + 5;
const int maxn = 60;
const int inf = 100000000;
int d[maxn][maxn];
bool g[maxn][maxn][logn];
int main()
{
int n,m;
scanf("%d%d",&n,&m);
for(int i = 1; i <= n;++i)
for(int j = 1;j <= n;++j)d[i][j] = inf;
for(int i = 1;i <= m;++i)
{
int a,b;
scanf("%d%d",&a,&b);
d[a][b] = 1, g[a][b][0] = 1;
}
for(int p = 1; p < logn; ++p)
for(int k = 1; k <= n;++k)
for(int i = 1; i <= n; ++i)
for(int j = 1; j <= n;++j)
{
if(g[i][k][p-1] && g[k][j][p-1]) g[i][j][p] = 1, d[i][j] = 1;
}
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]);
printf("%d",d[1][n]);
return 0;
}
洛谷1613 跑路 倍增 + Floyd的更多相关文章
- 洛谷 P1613 跑路 (倍增 + DP + 最短路)
题目链接:P1613 跑路 题意 给定包含 \(n\) 个点和 \(m\) 条边的有向图,每条边的长度为 \(1\) 千米.每秒钟可以跑 \(2^k\) 千米,问从点 \(1\) 到点 \(n\) 最 ...
- 洛谷P1613 跑路(最短路+倍增)
P1613 跑路 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的 ...
- 洛谷P1613 跑路
P1613 跑路 176通过 539提交 题目提供者该用户不存在 标签倍增动态规划 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 这个题的数据.. 题意问题 表意 题目描述 小A的工作不仅繁 ...
- 洛谷——P1613 跑路
P1613 跑路 题目大意: 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B ...
- 洛谷 P1613 跑路 解题报告
P1613 跑路 题目描述 小\(A\)的工作不仅繁琐,更有苛刻的规定,要求小\(A\)每天早上在\(6:00\)之前到达公司,否则这个月工资清零.可是小\(A\)偏偏又有赖床的坏毛病.于是为了保住自 ...
- 洛谷 P1613 跑路 题解
P1613 跑路 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的 ...
- LUOGU P1613 跑路 (倍增floyd)
解题思路 倍增$floyd$,首先设$f[i][j][k]$表示$i$这个点到$j$的距离能否为$2^k$,初值是如果x,y之间有边,那么$f[x][y][0]=1$.转移方程就是$f[i][j][t ...
- 【luogu1613】跑路 - 倍增+Floyd
题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟 ...
- 洛谷P1613 跑路 图论
正解:倍增+图论 解题报告: 传送门! 话说这题是真滴很妙啊,,,大概港下QwQ 首先看懂这道题,它是说,只要是1<<k的都能1s跑过,而且每条边的长度都是1,就是说一秒可以跑过1< ...
随机推荐
- 洛谷P2038 无线网络发射器选址 水题 枚举
刚开始边界写错了(将128写成127). 注意n <= 20,所以可以每读入一个点就将其周边更新,这样最多也只会有 40 * 40 * 20 种位置需要被枚举. Code: #include&l ...
- MaterialDesign动画
一.概述 MaterialDesign设计理念 MaterialDesign动画 二.实例讲解 (1)Touch Feedback (2)Reveal Effect (3)Activity Trans ...
- python二级登陆菜单
""" 1.三级菜单 注册 登陆 注销 2.进入每一个一级菜单,都会有下一级的菜单"""user_item = dict()try: whi ...
- 将JavaBean对象/List或Set或Map对象转成JSON方式
一.通过Struts2插件包(即使用Struts框架)自动生成JSON文本 二.使用第三方工具,将JavaBean对象/List或Set或Map对象转成JSON 准备导入第三方jar包: >c ...
- mDNS 原理的简单理解
转自:http://www.binkery.com/post/318.html mDNS 原理的简单理解 mDNS multicast DNS , 使用5353端口. 在局域网内,你要通过一台主机和其 ...
- Vue学习之路第十二篇:为页面元素设置内联样式
1.有了上一篇的基础,接下来理解内联样式的设置会更简单一点,先看正常的css内联样式: <dvi id="app"> <p style="font-si ...
- ELO kernels 记录
these kernel for discuss how to handle outliers in target values. 一:Ashish Gupta: 在16年6月到18年8月,激活卡的人 ...
- windows 查看端口号被占用
1.netstat -ano 2.tasklist | findstr xxx 3.进程管理杀掉
- MAVEN 的常用命令
1.清除命令:mvn clean 2.编译命令:mvn conpile 3.打包命令:mvn package 4.跳过单元测试命令:mvn clean package -Dmaven.test.sk ...
- jQuery(Dom节点操作)