洛谷 P1613 跑路 题解
P1613 跑路
题目描述
小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零。可是小A偏偏又有赖床的坏毛病。于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟可以跑2^k千米(k是任意自然数)。当然,这个机器是用longint存的,所以总跑路长度不能超过maxlongint千米。小A的家到公司的路可以看做一个有向图,小A家为点1,公司为点n,每条边长度均为一千米。小A想每天能醒地尽量晚,所以让你帮他算算,他最少需要几秒才能到公司。数据保证1到n至少有一条路径。
输入格式
第一行两个整数n,m,表示点的个数和边的个数。
接下来m行每行两个数字u,v,表示一条u到v的边。
输出格式
一行一个数字,表示到公司的最少秒数。
输入输出样例
输入 #1
4 4
1 1
1 2
2 3
3 4
输出 #1
1
说明/提示
【样例解释】
1->1->2->3->4,总路径长度为4千米,直接使用一次跑路器即可。
【数据范围】
50%的数据满足最优解路径长度<=1000;
100%的数据满足n<=50,m<=10000,最优解路径长度<=maxlongint。
【思路】
倍增 + 弗洛伊德(或其他最短路的算法)
先用倍增预处理出来两个点之间跳2^k能不能到达
处理的时候不像是跑倍增
有什么dfs什么的
可以类似弗洛伊德
从小到大枚举k,中间点和两个点
然后如果两个点到中间点都是需要 \(2^{k-1}\) 步就可以跑过去
那么这两个点之间就可以通过 \(2^k\) 跳过去
然后如果这两个点可以跳起来
那就可以用一个弗洛伊德常用的二维数组储存一下
距离为1
最后就可以跑弗洛伊德了
枚举中间点和两个点
如果两个点到中间点的距离和加起来小于两个点之间的直接距离
那就替换掉
输出f[1][n]就可以了
注意:
这是有向边!不要想当然的想成无向边!
【完整代码】
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int Max = 55;
bool fa[Max][Max][34];
int n,m;
bool use[Max];
int f[Max][Max];
int main()
{
memset(f,9999,sizeof(f));
cin >> n >> m;
int u,v;
for(register int i = 1;i <= m;++ i)
{
cin >> u >> v;
f[u][v] = 1;
fa[u][v][0] = true;
}
for(register int l = 1;l <= 32;++ l)
for(register int k = 1;k <= n;++ k)
for(register int i = 1;i <= n;++ i)
for(register int j = 1;j <= n;++ j)
if(fa[i][k][l - 1] == true && fa[k][j][l - 1] == true)
fa[i][j][l] = true,f[i][j] = 1;
for(register int k = 1;k <= n;++ k)
for(register int i = 1;i <= n;++ i)
for(register int j = 1;j <= n;++ j)
if(i != k && j != k)
f[i][j] = min(f[i][j],f[i][k] + f[k][j]);
cout << f[1][n] << endl;
return 0;
}
洛谷 P1613 跑路 题解的更多相关文章
- 洛谷P1613 跑路
P1613 跑路 176通过 539提交 题目提供者该用户不存在 标签倍增动态规划 难度普及+/提高 提交该题 讨论 题解 记录 最新讨论 这个题的数据.. 题意问题 表意 题目描述 小A的工作不仅繁 ...
- 洛谷 P1613 跑路 解题报告
P1613 跑路 题目描述 小\(A\)的工作不仅繁琐,更有苛刻的规定,要求小\(A\)每天早上在\(6:00\)之前到达公司,否则这个月工资清零.可是小\(A\)偏偏又有赖床的坏毛病.于是为了保住自 ...
- 洛谷P1613 跑路(最短路+倍增)
P1613 跑路 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的 ...
- 洛谷——P1613 跑路
P1613 跑路 题目大意: 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B ...
- 洛谷 P1613 跑路 (倍增 + DP + 最短路)
题目链接:P1613 跑路 题意 给定包含 \(n\) 个点和 \(m\) 条边的有向图,每条边的长度为 \(1\) 千米.每秒钟可以跑 \(2^k\) 千米,问从点 \(1\) 到点 \(n\) 最 ...
- 洛谷P1613 跑路 图论
正解:倍增+图论 解题报告: 传送门! 话说这题是真滴很妙啊,,,大概港下QwQ 首先看懂这道题,它是说,只要是1<<k的都能1s跑过,而且每条边的长度都是1,就是说一秒可以跑过1< ...
- 洛谷1613 跑路 倍增 + Floyd
首先,我们一定要认识到本题中的最短时间所对应的道路不一定是在起点到终点的最短路.例如,起点到终点的最短路为 151515 ,那么对 151515 进行二进制拆分的话是 111111111111 ,这时 ...
- P1613 跑路(倍增)
P1613 跑路(倍增) 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十 ...
- 【Luogu】P1613 跑路
[Luogu]P1613 跑路 一.题目 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资 ...
随机推荐
- Unity的学习笔记(摇杆制作)
最近看到了一个很新颖的摇杆,就是按下后,会出现在按下的位置,并且拖着走的时候,到一定距离整个摇杆也会跟着走,于是自己测试做了一下这种摇杆 首先,先说一下我的摇杆预设体结构 代码挂在哪里都无所谓,关键是 ...
- Linux中shell字符串分隔、字符串替换、字符串拼接
1.从properties文件中读取变量 SERVER_NAME=`sed '/project.config/!d;s/.*=//' conf/dubbo.properties | tr -d '\r ...
- 使用activiti的designer插件记录
1.activiti添加排他网,条件下载condition中 2.activiti添加监听Listener,知道3种方法 1.实现taskListener 通过加载java class的方式去加载实现 ...
- 7.1 为什么bulk使用奇特的json格式?
回顾: bulk的语法要求:每个json串都不能换行,不同json串之间,必须换行 为什么不用标准json数组呢?如: [ { "create":{.. ...
- Java调用WebService方法总结(8)--soap.jar调用WebService
Apache的soap.jar是一种历史很久远的WebService技术,大概是2001年左右的技术,所需soap.jar可以在http://archive.apache.org/dist/ws/so ...
- 【洛谷 P3804】 【模板】后缀自动机
题目链接 #include <cstdio> #include <cstring> #include <algorithm> using namespace std ...
- MonoSymbolFileException in CheckLineNumberTable
Mono.CompilerServices.SymbolWriter.MonoSymbolFileException: Exception of type 'Mono.CompilerServices ...
- 【译】Python数据结构
本章将更详细地描述您已经学到的一些内容,并添加了一些新的内容. 5.1 关于列表的更多内容 列表数据类型有一些更多的方法. 以下是列表对象的所有方法: list.append(x) 将项目添加到列表的 ...
- SpringBoot+SpringCloud+vue+Element开发项目——数据库设计
1.用户表(sys_user) CREATE TABLE `sys_user` ( `id` ) NOT NULL AUTO_INCREMENT COMMENT '编号', `name` ) NOT ...
- Java8 stream用法-备忘录
1. 如何使用匹配模式 List<String> strs = Arrays.asList("a", "a", "a", &qu ...