Luogu 1613 跑路(最短路径,倍增) Description 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟可以跑2^k千米(k是任意自然数).当然,这个机器是用longint存的,所以总跑路长度不能超过maxlongint千米.小A的家到公司的路可以看做一个有向图,小A家为点1,公司为点n,每条边长度均为一千米.小A想每天能醒地尽量晚,所以让你…
题面 传送门:https://www.luogu.org/problemnew/show/P1613 Solution 挺有意思的一道题. 题面已经挺明显的描述出了这题的主要思想:倍增. 先这样想,我们可以把这题这样建模:有一堆点,若两个点之间的距离之和可以达到2的n次方,那么这两个点可以用1的时间相互到达. 也就是说,我们把距离能为2的n次方的点对用边权为1的边连上,再做一次最短路径,就可以求出答案了. 接下来问题就是如何求出每两个点是否能以2的n次方的时间相互到达. 考虑使用DP. 我们设f…
题目传送门 开始的思路:直接跑一遍最短路,得到最短路的那个值.然后把那个值进行一下二进制拆分,看能拆几次.(可能是受到了刚做过的题影响) ;i>=;i--) { <<i)>qwq) continue; //printf("%d\n",i); qwq-=(<<i);ans++; } (二进制拆分从大到小趋近) 但实际上貌似是审错题了...只有在两点最短距离为$2^k$时才能用加速器.那么我们就需要枚举所有点对,看他们的 距离是否为$2^k$,是的话才能…
P1613 跑路(倍增) 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟可以跑2^k千米(k是任意自然数).当然,这个机器是用longint存的,所以总跑路长度不能超过maxlongint千米.小A的家到公司的路可以看做一个有向图,小A家为点1,公司为点n,每条边长度均为一千米.小A想每天能醒地尽量晚,所以让你帮他算算,他最少需要几秒才能到公司…
题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资,小A买了一个十分牛B的空间跑路器,每秒钟可以跑2^k千米(k是任意自然数).当然,这个机器是用longint存的,所以总跑路长度不能超过maxlongint千米.小A的家到公司的路可以看做一个有向图,小A家为点1,公司为点n,每条边长度均为一千米.小A想每天能醒地尽量晚,所以让你帮他算算,他最少需要几秒才能到公司.数据保证1到n至少有一条…
解题思路 倍增$floyd$,首先设$f[i][j][k]$表示$i$这个点到$j$的距离能否为$2^k$,初值是如果x,y之间有边,那么$f[x][y][0]=1$.转移方程就是$f[i][j][t]|=(f[i][k][t-1]\&f[k][j][t-1])$,就是传递闭包.因为跑步机只能到$2^k$,那么就把所有$f[i][j][k]=1$的(i,j)之间连一条距离为1的边,最后跑一个最短路. #include<iostream> #include<cstdio> #…
题目链接在此 其实我看到这道题一点想法都没有 设f[i][j][k]表示用2i秒能不能从j走到k.如果可以,那j到k就可以一秒走到,它们的路径长度就是1.方程为f[i][j][k]=f[i-1][j][l]&&f[i-1][l][k]. 最后在图上跑一遍Floyd.复杂度O(n3). 代码如下 #include<cstdio> #include<cstdlib> #include<cctype> #include<cstring> inlin…
首先,我们一定要认识到本题中的最短时间所对应的道路不一定是在起点到终点的最短路.例如,起点到终点的最短路为 151515 ,那么对 151515 进行二进制拆分的话是 111111111111 ,这时求出的最短时间为4.然而如果有一条长度为 161616 的路径的话最短时间就为 111,显然比之前求的更优 . 我们在这里定义两个数组: intintint d[i][j]d[i][j]d[i][j],即代表点 (i,j)(i,j)(i,j) 之间的最短跑步时间. boolboolbool g[i]…
一开始看这道题时,发现是最短路,可是搜的又是倍增的题无可分说这是倍增+最短路 但是Dijkstra,SPFA我又不熟,可是看了数据范围心中萌生一种用Floyd做的方法 不扯了 先设一个三维bool数组是用来表示是否i到j之间有一条长度2^k的边 再设一个二维int数组是用来存时间的,再把n,m定上(定义完成) 如果说,bool数组f[i][j][k]中任意一组变为true,那么我们就可以让a[i][j]=1,表示i到j之间这一秒可以到达 那为什么不能直接在Floyd中判断ijk相等呢?因为题目中…
https://www.luogu.org/problemnew/show/P1613 他有一个跑路机器,每次只能跑2k   (单位)路程,每相邻两个点的路程为1,也就是说如果连边1——>2——>3——>4——>5,路径长度为4,那么他可以一次从1跳到5: n<=50; 我们要找的不是最短路径,而是一条路路程二进制数中1的个数最少: 这数据范围floyd已经够了,但是我们要提前处理一下连边: 我们将相距2k  距离的两点距离设为1,这样再跑最短路就是正确答案:. 倍增思想体现…