洛谷 P1613 解题报告
P1613 跑路
题目描述
小\(A\)的工作不仅繁琐,更有苛刻的规定,要求小\(A\)每天早上在\(6:00\)之前到达公司,否则这个月工资清零。可是小\(A\)偏偏又有赖床的坏毛病。于是为了保住自己的工资,小\(A\)买了一个十分牛B的空间跑路器,每秒钟可以跑\(2^k\)千米(\(k\)是任意自然数)。当然,这个机器是用\(long\) \(int\)存的,所以总跑路长度不能超过\(max\) \(long\) \(int\)千米。小\(A\)的家到公司的路可以看做一个有向图,小\(A\)家为点\(1\),公司为点\(n\),每条边长度均为一千米。小\(A\)想每天能醒地尽量晚,所以让你帮他算算,他最少需要几秒才能到公司。数据保证\(1\)到\(n\)至少有一条路径。
输入输出格式
输入格式:
第一行两个整数\(n\),\(m\),表示点的个数和边的个数。
接下来m行每行两个数字\(u\),\(v\),表示一条\(u\)到\(v\)的边。
输出格式:
一行一个数字,表示到公司的最少秒数。
说明
\(50\)%的数据满足最优解路径长度\(<=1000\);
\(100\)%的数据满足\(n<=50\),\(m<=10000\),最优解路径长度\(<=\) \(max\) \(long\) \(int\)。
首先,要确保自己的语文水平苟的住,这个鬼机器,每秒跑\(2^kkm\)的话是要跑刚好那么长的,不能多也不能少。
那么岂不是代表,只有长为\(2^kkm\)的链才算是有效边吗?
我们把所有有效边连上,跑最短路不就行了嘛。
如何求有效边?
\(2^k?\)有没有想到什么?
\(2^k=2^{k-1}+2^{k-1}?\)
对,就是倍增啊!
令\(g[u][v][j]\)代表点\(u\)到点\(v\)存在或不存在长度为\(2^j\)的边。
当\(g[u][k][j-1]\)和\(g[k][v][j-1]\)同时存在时,
\(g[u][v][j]\)存在。(\(k\)是枚举的一维)
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=52;
int g[N][N][70],n,m;
//g[i][j][k]表示i点到j点存在边权为2^k的路
int g0[N][N];
int read()
{
int x=0;char c=getchar();
while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
return x;
}
queue <int > q;
int used[N],dis[N];
void spfa()
{
memset(used,0,sizeof(used));
used[1]=1;
memset(dis,0x3f,sizeof(dis));
dis[1]=0;
q.push(1);
while(!q.empty())
{
int u=q.front();
q.pop();
used[u]=0;
for(int v=1;v<=n;v++)
if(g0[u][v]&&dis[v]>dis[u]+g0[u][v])
{
dis[v]=dis[u]+g0[u][v];
if(!used[v])
{
used[v]=1;
q.push(v);
}
}
}
}
int main()
{
memset(g,0,sizeof(g));
memset(g0,0,sizeof(g0));
n=read(),m=read();
int u,v;
for(int i=1;i<=m;i++)
{
u=read(),v=read();
g[u][v][0]=1;
//f[u][v][0]=v;
}
for(int j=1;j<=64;j++)
for(int k=1;k<=n;k++)
for(u=1;u<=n;u++)
for(v=1;v<=n;v++)
if(g[u][k][j-1]&&g[k][v][j-1])
g[u][v][j]=1;
for(u=1;u<=n;u++)
for(v=1;v<=n;v++)
for(int j=0;j<=64;j++)
if(g[u][v][j])
{
g0[u][v]=1;
break;
}
spfa();
printf("%d\n",dis[n]);
return 0;
}
2018.5.2
洛谷 P1613 解题报告的更多相关文章
- 洛谷 P1462 解题报告
P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...
- 洛谷 P1879 解题报告
P1879 [USACO06NOV]玉米田Corn Fields 题目描述 农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1 ≤ M ≤ 12; 1 ≤ ...
- 洛谷 P1069 解题报告
P1069 细胞分裂 题目描述 \(Hanks\)博士是\(BT\) (\(Bio-Tech\),生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. \(Hanks\) ...
- 洛谷 P2491 解题报告
P2491 消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个 ...
- 洛谷 P2587 解题报告
P2587 [ZJOI2008]泡泡堂 题目描述 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏 ...
- 洛谷 P1054 解题报告
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 洛谷 P1053 解题报告
P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...
- 洛谷 P1057 解题报告
P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹 ...
- 洛谷 P1430 解题报告
P1430 序列取数 题目描述 给定一个长为\(n\)的整数序列\((n<=1000)\),由\(A\)和\(B\)轮流取数(\(A\)先取).每个人可从序列的左端或右端取若干个数(至少一个), ...
随机推荐
- iOS开发支付集成之微信支付
这一篇是<iOS开发之支付>这一部分的继支付宝支付集成,银联支付集成第三篇,微信支付.在集成的时候建议都要去下载最新版的SDK,因为我知道的前不久支付宝,银联都更新了一次,微信的不太清楚更 ...
- nginx 配置open_cache_file 静态文件的缓存
open_file_cache max=65535 inactive=30s 最多缓存多少个文件,缓存多少时间open_file_cache_min_uses 1 在30S中没有使用到这个配置的次数的 ...
- 内存数据网格hazelcast的一些机制原理
hazelcast作为一个内存数据网格工具,还算比较优秀,听说有Apache顶级项目使用它,值得研究下,使用文档可以直接看官方文档,但机制原理相关的资料基本没有,本人硬撸源码写的一些东西,跟大家分享一 ...
- HDTV(1920x1080)码率和视频质量关系的研究 2 (实验结果)
上一篇文章中介绍了实验的准备工作, HDTV(1920x1080)码率和视频质量关系的研究 1 (前期准备) 本文介绍一下实验的结果. 首先来看一下主观评价的试验结果: 从实验结果来看,可以得出以下结 ...
- PCMM(人力资源能力成熟度模型)V2.0中英对照版发布
PCMM中英版终于发布 时光荏苒,从当初的回眸到如今的回头,这才发现:坚守一份承诺是多么的不易! 一年多了,这份承载殷切期待的作品--<PCMM(人力资源能力成熟度模型)V2.0 (中英文对照版 ...
- Oracle Applications DBA 基础(一)
1.引子 2014年9月13日 20:33 <oracle Applications DBA 基础>介绍Oracle Applications R12的系统架构, 数据库后台及应用系统的基 ...
- OpenCV矩阵运算
矩阵处理 1.矩阵的内存分配与释放 (1) 总体上: OpenCV 使用C语言来进行矩阵操作.不过实际上有很多C++语言的替代方案可以更高效地完成. 在OpenCV中向量被当做是有一个维数为1的N维矩 ...
- Gradle 1.12用户指南翻译——第四十一章. 项目报告插件
本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...
- C语言之linux内核可变参实现printf,sprintf
昨天,我发表了一篇用可变参实现的fprintf函数,其实说实话还不完全是可变参实现的,因为用到了FILE * 这样的指针,需要包含stdio.h这个头文件才能实现这个函数,今天我们就来看看,如何抛弃s ...
- Android的Context Manager(服务管理器)源码剖析-android学习之旅(99)
Context Manager介绍 Context Manager对应的进程是servicemanager进程,它先于Service Server和服务客户端运行,进入接收IPC数据的待机状态,处理来 ...