首先,我们一定要认识到本题中的最短时间所对应的道路不一定是在起点到终点的最短路。例如,起点到终点的最短路为 151515 ,那么对 151515 进行二进制拆分的话是 111111111111 ,这时求出的最短时间为4。然而如果有一条长度为 161616 的路径的话最短时间就为 111,显然比之前求的更优 。

我们在这里定义两个数组:

  1. intintint d[i][j]d[i][j]d[i][j],即代表点 (i,j)(i,j)(i,j) 之间的最短跑步时间。
  2. 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的更多相关文章

  1. 洛谷 P1613 跑路 (倍增 + DP + 最短路)

    题目链接:P1613 跑路 题意 给定包含 \(n\) 个点和 \(m\) 条边的有向图,每条边的长度为 \(1\) 千米.每秒钟可以跑 \(2^k\) 千米,问从点 \(1\) 到点 \(n\) 最 ...

  2. 洛谷P1613 跑路(最短路+倍增)

    P1613 跑路 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的 ...

  3. 洛谷P1613 跑路

    P1613 跑路 176通过 539提交 题目提供者该用户不存在 标签倍增动态规划 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 这个题的数据.. 题意问题 表意 题目描述 小A的工作不仅繁 ...

  4. 洛谷——P1613 跑路

    P1613 跑路 题目大意: 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B ...

  5. 洛谷 P1613 跑路 解题报告

    P1613 跑路 题目描述 小\(A\)的工作不仅繁琐,更有苛刻的规定,要求小\(A\)每天早上在\(6:00\)之前到达公司,否则这个月工资清零.可是小\(A\)偏偏又有赖床的坏毛病.于是为了保住自 ...

  6. 洛谷 P1613 跑路 题解

    P1613 跑路 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的 ...

  7. LUOGU P1613 跑路 (倍增floyd)

    解题思路 倍增$floyd$,首先设$f[i][j][k]$表示$i$这个点到$j$的距离能否为$2^k$,初值是如果x,y之间有边,那么$f[x][y][0]=1$.转移方程就是$f[i][j][t ...

  8. 【luogu1613】跑路 - 倍增+Floyd

    题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟 ...

  9. 洛谷P1613 跑路 图论

    正解:倍增+图论 解题报告: 传送门! 话说这题是真滴很妙啊,,,大概港下QwQ 首先看懂这道题,它是说,只要是1<<k的都能1s跑过,而且每条边的长度都是1,就是说一秒可以跑过1< ...

随机推荐

  1. jquery.lazyload滚动不起作用

    昨天同事在开发图片懒加载功能时用到了lazyload,使用相当标准,然而结果却不如人意,在滚动时未能起作用.引用https://cdn.bootcss.com/jquery_lazyload/1.9. ...

  2. css3 3d  魔方

    <style><!--@charset "UTF-8"; * { margin: 0; padding: 0 } html,body{ width: 100%; ...

  3. 【ACM-ICPC 2018 南京赛区网络预赛 I】Skr

    [链接] 我是链接,点我呀:) [题意] 让你把一个字符串的所有回文子串加起来.(当做数字加起来) 求他们的和. [题解] 回文树. 从两个根节点分别遍历整棵回文树. 按照每个节点的定义. 得到每个节 ...

  4. SSM知识巩固2

    数据回显 1.springmvc默认对pojo数据进行回显. pojo数据传入controller方法后,springmvc自动将pojo数据放到request域,key等于pojo类型(首字母小写) ...

  5. Adnroid_sdk安装代理

  6. ContextLoaderListener的说明

    ContextLoaderListener是配置在web.xml里的,具体如下: <!-- ContextLoaderListener是个监听器,用来监听容器启动事件,监听到容器启动事件后 其c ...

  7. 2015 Multi-University Training Contest 10 hdu 5411 CRB and Puzzle

    CRB and Puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)To ...

  8. NYIST 1083 美丽的校园

    美丽的校园时间限制:1000 ms | 内存限制:65535 KB难度:3 描述 美丽的校园需要大家维护,作为南工学子,当然有责任! 在计科系门前有n棵树,按一行排列在计科系楼前面,它们在一条直线上, ...

  9. [Beginning SharePoint Designer 2010]列表和库&内部内容类型

    本章概要: 1.SPS如何组织管理数据 2.如何创建列表和文档库 3.如何使用视图来过滤分类,分组列表和库 4.如何创建内容类型来应用一个定义好的结构到数据和文档中

  10. 推荐几款VisualStudio的插件

    继前几天推荐了一款转换vs插件的插件后,借着安装VS2013之际,把我比较喜欢的几个插件继续推荐一下. C# Outline 2013 2013 C#的代码折叠最小只能到函数级,不像C++那样可以折叠 ...