Luogu P1613 跑路 题解 [ 蓝 ] [ 倍增 ] [ Floyd 最短路 ] [ 状压 dp ]
跑路:绝佳倍增好题,思路是化 \(2^k\) 为 \(1\) ,倍增起预处理作用。
最近不知道是撞了什么运,前一脚看的是绿题,写完之后交一发,发现直接被 lxl 升蓝了,血赚。
思路:Floyd
首先观察到每次走 \(2^k\) 的代价为 \(1\) ,我们可以预处理出每次走 \(2^i\) 能到哪些点。
但为了让这题的代码更好实现一些,观察到 \(n\) 较小,只有 \(50\) ,于是就可以定义邻接矩阵,\(g[i][j][k]\) 表示从 \(j\) 走 \(2^i\) 步能否到 \(k\) 点,能到即为 \(1\) 。
于是转移方程就出来了,我们枚举一下中点 \(l\) ,然后:
\]
这样我们就求出某个点能否用 \(1\) 的代价到另一个点,化 \(2^k\) 成 \(1\) 了。
接下来就直接建边,跑 Floyd 或者其他乱七八糟的算法求最短路即可。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int,int> pi;
int n,m,f[55][55];
bitset<55>g[70][55];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
//prepare
for(int i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
g[0][u][v]=1;
}
for(int i=1;i<=64;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
for(int l=1;l<=n;l++)
{
g[i][j][k]=g[i][j][k]|(g[i-1][j][l]&g[i-1][l][k]);
}
}
}
}
//build graph
memset(f,0x3f,sizeof(f));
for(int i=1;i<=n;i++)f[i][i]=0;
for(int i=0;i<=64;i++)
{
for(int j=1;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
if(g[i][j][k]==1)f[j][k]=min(f[j][k],1);
}
}
}
//Floyd
for(int k=1;k<=n;k++)
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
}
}
}
cout<<f[1][n];
return 0;
}
思路:状压 dp
口胡一下,和上面的那种方法差不多。
首先用 vector 记录下从点 \(i\) 走 \(2^k\) 步能到哪些点,然后就建出了一张图。
接下来从 \(0\) 的状态开始,层层向外拓展能到达的点,最后拓展到 \(n\) 时 break 掉并输出此时拓展的层数即可。
注意状态用 ll 存,int 开不下。
Luogu P1613 跑路 题解 [ 蓝 ] [ 倍增 ] [ Floyd 最短路 ] [ 状压 dp ]的更多相关文章
- [Luogu P1613]跑路 (DP+倍增+最短路)
题面 传送门:https://www.luogu.org/problemnew/show/P1613 Solution 挺有意思的一道题. 题面已经挺明显的描述出了这题的主要思想:倍增. 先这样想,我 ...
- 洛谷 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 ...
- Luogu P1613跑路【倍增】By cellur925
题目传送门 开始的思路:直接跑一遍最短路,得到最短路的那个值.然后把那个值进行一下二进制拆分,看能拆几次.(可能是受到了刚做过的题影响) ;i>=;i--) { <<i)>qw ...
- luogu P1613 跑路
一开始看这道题时,发现是最短路,可是搜的又是倍增的题无可分说这是倍增+最短路 但是Dijkstra,SPFA我又不熟,可是看了数据范围心中萌生一种用Floyd做的方法 不扯了 先设一个三维bool数组 ...
- P1613 跑路(倍增)
P1613 跑路(倍增) 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十 ...
- 【Luogu】P1613 跑路
[Luogu]P1613 跑路 一.题目 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资 ...
- 洛谷 P1613 跑路 (倍增 + DP + 最短路)
题目链接:P1613 跑路 题意 给定包含 \(n\) 个点和 \(m\) 条边的有向图,每条边的长度为 \(1\) 千米.每秒钟可以跑 \(2^k\) 千米,问从点 \(1\) 到点 \(n\) 最 ...
- Luogu 1613 跑路(最短路径,倍增)
Luogu 1613 跑路(最短路径,倍增) Description 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是 ...
- 洛谷P1613 跑路(最短路+倍增)
P1613 跑路 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的 ...
随机推荐
- 基于python搭建FTP服务
使用python搭建FTP服务非常容易,且非常稳定,更重要的是可以实现一些精细化的控制,例如精细的访问权限配置,详细的日志记录等工作 这里是使用了pyftpdlib模块 1. 安装 pip insta ...
- 【docker-compose】ElasticSearch安装教程
仅供学习参考 ,请勿轻易在生产环境使用 0. 目录树 1. 创建目录 mkdir -p /docker/elasticsearch/conf /docker/elasticsearch/data /d ...
- java 死锁问题排查
排查过程 1.识别死锁现象 通常,死锁会表现为应用程序挂起,不响应用户请求或 cpu 使用率下降. 2.收集线程转储 当应用出现不响应时,可以使用以下方法收集线程转储: jstack -l 进程ID ...
- go build tags使用
转载请注明出处: 在 Go 语言中,构建标签(Build Tags)是一种用于条件编译的机制,可以帮助开发者根据不同的条件选择性地编译特定的代码块.它们在处理多平台和多环境的代码时特别有用,例如为不同 ...
- Acrobat Pro DC 2024.005 像word一样编辑PDF
随着数字化的推广,PDF文件凭借其强大的优势和稳定性逐渐成为各类文档交流和存储的首选格式.随之而来的是对PDF文件的阅读.编辑.转换.转曲等各种操作需求的不断增长.因此,一款强大的PDF处理软件不仅需 ...
- 注册美区 Apple ID 账号!都2020年了,你还没有一个自己的海外苹果ID?
写在前面: 小伙伴们学腻了技术,不防今天来点大家都感兴趣的海外苹果 Apple ID 吧! 今天就教大家怎么注册美区 Apple ID,这个方法也是目前注册苹果美区 Apple ID 最快最简单的 ...
- How To Install and Enable SSH Server on Debian 10
https://devconnected.com/how-to-install-and-enable-ssh-server-on-debian-10/ How To Install and Enabl ...
- SM国密算法
package com.abc.apollo.common.util; import javax.crypto.IllegalBlockSizeException; import java.secur ...
- shell 获取 目录名 当前目录名
Four ways to extract the current directory name By Sergio Gonzalez Duran on November 06, 2007 (9:00 ...
- logback高级特性使用(二) 自定义Pattern模板
原文链接:https://blog.csdn.net/chenjie2000/article/details/8892764 创建自定义格式转换符有两步: 1.写一个转换器类,继承ClassicCon ...