题面

传送门:https://www.luogu.org/problemnew/show/P1613


Solution

挺有意思的一道题。

题面已经挺明显的描述出了这题的主要思想:倍增

先这样想,我们可以把这题这样建模:有一堆点,若两个点之间的距离之和可以达到2的n次方,那么这两个点可以用1的时间相互到达

也就是说,我们把距离能为2的n次方的点对用边权为1的边连上,再做一次最短路径,就可以求出答案了。

接下来问题就是如何求出每两个点是否能以2的n次方的时间相互到达。

考虑使用DP。

我们设f[i][j][k] 表示 i到j是否能以2的k次方的距离相互到达

转移的时候得运用倍增的思想:若两个点能以两端2的k-1次方的距离相互到达,那么两个点就能以2的k次方的距离相互到

接下来我们就可以运用类似Floyd的办法来处理这个DP,我们可以在最外层枚举这个k,里面三层和Floyd的意义一模一样,就是枚举中转点与起始点。

初始化就是题目中直接相连的两个点,它们的f[a][b][0]=1 (它们距离为1,是2的0次方)

时间复杂度: O(n^3*64)


Code

//Luogu P1613 跑路
//June,13th,2018
//倍增+DP+最短路
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long read()
{
long long x=0,f=1; char c=getchar();
while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}
while(isdigit(c)){x=x*10+c-'0';c=getchar();}
return x*f;
}
const int N=50+10;
const int K=65+10;
int f[N][N][K],dis[N][N],n,m;
int main()
{
n=read(),m=read();
memset(dis,0x3f,sizeof dis);
for(int i=1;i<=m;i++)
{
int s=read(),t=read();
f[s][t][0]=1;
dis[s][t]=1;
} for(int o=1;o<=64;o++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
if(f[j][i][o-1]==true and f[i][k][o-1]==true)
{
f[j][k][o]=true;
dis[j][k]=1;
} for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
dis[j][k]=min(dis[j][k],dis[j][i]+dis[i][k]); printf("%d",dis[1][n]);
return 0;
}

正解(C++)

[Luogu P1613]跑路 (DP+倍增+最短路)的更多相关文章

  1. Luogu P1613跑路【倍增】By cellur925

    题目传送门 开始的思路:直接跑一遍最短路,得到最短路的那个值.然后把那个值进行一下二进制拆分,看能拆几次.(可能是受到了刚做过的题影响) ;i>=;i--) { <<i)>qw ...

  2. P1613 跑路(倍增)

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

  3. P1613 跑路【倍增】【最短路】

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

  4. luogu P1613 跑路

    一开始看这道题时,发现是最短路,可是搜的又是倍增的题无可分说这是倍增+最短路 但是Dijkstra,SPFA我又不熟,可是看了数据范围心中萌生一种用Floyd做的方法 不扯了 先设一个三维bool数组 ...

  5. LUOGU P1613 跑路 (倍增floyd)

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

  6. 【Luogu】P1613跑路(倍增+Floyd)

    题目链接在此 其实我看到这道题一点想法都没有 设f[i][j][k]表示用2i秒能不能从j走到k.如果可以,那j到k就可以一秒走到,它们的路径长度就是1.方程为f[i][j][k]=f[i-1][j] ...

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

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

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

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

  9. 【Luogu】P1613 跑路

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

随机推荐

  1. Centos-系统内存信息-free

    free 显示系统内存信息,包括物理内存.虚拟内存.共享内存和系统缓存 相关选项 -b 以字节byte为单位显示内存使用情况 -k  以k为单位显示内存使用情况 -m 以MB为单位显示内存使用情况 - ...

  2. HTML中css水平居中的几种方式

    1. 子元素为行内元素时,父元素使用 text-align: center; 实现子元素的水平居中: 2. 子元素为块级元素时, 2.1. 将子元素设置 margin: 0 auto; 实现居中: 2 ...

  3. matlab中ceil朝正无穷大四舍五入

    来源:https://ww2.mathworks.cn/help/matlab/ref/ceil.html?searchHighlight=ceil&s_tid=doc_srchtitle 本 ...

  4. 【学习笔记/题解】分层图/[JLOI2011]飞行路线

    题目戳我 \(\text{Solution:}\) 关于分层图: 一般用于处理:给你\(k\)次机会对边权进行修改的最短路问题. 算法流程: 建立出\(k\)层图,对应进行\(k\)次操作后的局面. ...

  5. 【题解】 [GZOI2017]小z玩游戏

    题目戳我 \(\text{Solution:}\) 考虑建图.操作可以看作对\(1\)进行的操作,于是有以下运行过程: \(1\to w[i]\to e[i]\to...\) 考虑倍数,一个数可以走到 ...

  6. mycat 单库分表实践

    参考 https://blog.csdn.net/sq2006hjp/article/details/78732227 Mycat采用的水平拆分,不管是分库还是分表,都是水平拆分的.分库是指,把一个大 ...

  7. 蒲公英 · JELLY技术周刊 Vol.25 · Webpack 5 正式发布,你学废了么

    蒲公英 · JELLY技术周刊 Vol.25 阔别两年,Webpack 5 正式发布了,不仅清理掉很多冗余的功能,同样也为我们带来了很多新鲜的能力,不论是默认开启的持久缓存,还是反病毒保护,亦或者被其 ...

  8. 多测师讲解python练习题_100以内奇数,偶数的和_高级讲师肖sir

    (1)通过while 循环来求出1-100之和'''(2)通过while 循环来求出1-100奇数之和'''(3)通过while 循环来求出1-100偶数之和''' 奇数和 sum1=0for i i ...

  9. ES6之数组

    数组新增方法 map(可以理解为是映射,以一定规则修改数组每一项并返回全新数组) reduce(可以理解为是汇总,一堆出来一个) filter(可以理解为过滤,筛选的意思,以一定规则拿到符合的项并返回 ...

  10. echo输出彩色文字

    开启转义功能 echo -e表示开启转义功能,比如: 彩色文字语法 echo -e "\e[前景;背景;特效m""hello""\e[0m" ...