【Luogu】P1613 跑路

news/2024/7/3 14:03:45

【Luogu】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。

二、题解

有点像最短路是吧。不过显然m条边是不够的,小A每次可以走\(2^k\)步,所以除了\(k=0\)即读入的边,我们还需要一些其他的边。考虑\(2^k(k \geq 1)\),是由2条\(2^{k-1}\)的边连接的。设\(edge[i][j][k]\)表示从\(i\)\(j\)是否可以通过\(2^k\)的边。所以可以用倍增求出所有其他的边。最后跑一遍最短路就好了。

三、代码

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF = 1e9;
const int MAXN = 50;
int n, m, edge[MAXN + 5][MAXN + 5][40], dis[MAXN + 5][MAXN + 5];
int main() {scanf("%d%d", &n, &m);for (int i = 1; i <= m; ++i) {int u, v;scanf("%d%d", &u, &v);edge[u][v][0] = true;}for (int k = 1; k <= 32; ++k)for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)for (int l = 1; l <= n; ++l)edge[i][j][k] = edge[i][j][k] || edge[i][l][k - 1] && edge[l][j][k - 1];for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)dis[i][j] = INF;for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)for (int k = 0; k <= 32; ++k)if (edge[i][j][k])dis[i][j] = 1;for (int k = 1; k <= n; ++k)for (int i = 1; i <= n; ++i)for (int j = 1; j <= n; ++j)dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);printf("%d\n", dis[1][n]);return 0;
}

转载于:https://www.cnblogs.com/herald/p/10001811.html


http://lihuaxi.xjx100.cn/news/236750.html

相关文章

EOSIO Dawn 4.0 发布

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 关于Dawn 4.0 RAM分配的反馈 一些社区成员表示担心&#xff0c;在其他任何人发现之前&#xff0c;有些人会通过购买便宜的内存来获得不合理的利润。…

自定义状态切换按钮

最近在做一个项目&#xff0c;一个界面的按钮UI给画成了这样&#xff08;默认状态是蓝色的然后触摸后变成灰色的&#xff09; UI效果然后本着给低版本系统APP适配的职业素养&#xff08;其实是不想画这种按钮&#xff09;&#xff0c;想让UI兄弟给将图标改成整个按钮效果的图片…

EOS Cleos 命令使用指南

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 命令参考 操作 语法 例子 获取所有命令 $ cleos 例子 获取所有子命令 $ cleos ${command} 例子 链接节点 $ cleos --url node:{node}:no…

[USACO07JAN]平衡的阵容Balanced Lineup BZOJ 1699

题目背景 题目描述&#xff1a; 每天,农夫 John 的N(1 < N < 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. John 准备了Q (1 < Q < 18…

Java基础知识回顾之六 ----- IO流

前言 在上一篇文章中&#xff0c;回顾了Java的多线程。而在本篇文章中主要介绍Java IO的相关知识。 IO的介绍 什么是IO&#xff1f; IO的名称又来是Input与Output的缩写&#xff0c;也就是输入流和输出流。输入流用于从源读取数据&#xff0c;输出流用于向目标写数据。 可以从下…

[每日短篇] 17 - 正确使用随机数 Random

2019独角兽企业重金招聘Python工程师标准>>> 随机数在系统开发中几乎是不可避免的一个需求&#xff0c;在大多数面试宝典一定会告诉你所谓的随机数其实是“伪”随机数&#xff0c;除此之外也就没有什么别的了。实际上这条知识本身已经是非常落后了&#xff0c;更不用…

模拟器抓取https方法

说明&#xff1a;为了解决安卓手线上不能抓取https请求&#xff0c;以下整理通过模拟器抓取https请求方法如下&#xff1a;前置条件&#xff1a;安卓模拟器1、夜神抓包工具&#xff1a;fiddler、charles不要安装证书 第一步安装模拟器 可以按照夜神模拟器步骤省略 第二步de.rob…

区块链分享

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链行业现状 政府关注 企业极力研究 学术取得共识 学校和培训机构设立学科 资方积极参与 争先恐后炒币 技术不完善 借区块链热点的传销和骗局横…