【倍增】[luoguP1613]跑路
来源:互联网 发布:林业大数据平台 编辑:程序博客网 时间:2024/05/17 06:21
题目
做完之后出现了一个大问题 - - 虽然这是个倍增但这个代码怎么看怎么像DP
这道题是一个倍增加最短路的题好题 n很小所以用floyd就够了
当然就算用什么堆优化迪杰斯特拉也没啥用必经倍增就
每秒可以跑2^k米 所以可以预处理出1秒钟可以到达的边 再用一个Floyd求出1到n的最短路径就可以了
关于预处理:
f[i][u][v]表示u到v能否通过2^i到达 边界条件就是在读入的时候得到的f[0][u][v]的值 然后从1~32(因为最大2^31)枚举 同时枚举u和v 借助Floyd思想枚举一个点k 如果f[i-1][u][k]和f[i-1][k][v]都是可以的 那么f[i][u][v]肯定也可以(
代码如下
#include<iostream>#include<cstdio>#include<cctype>#include<cstring>#include<string> using namespace std; #define in = read(); typedef long long ll; typedef unsigned int ui; const ll size = 100 + 1; int n , m , u , v; int map[size][size]; int f[size][size][size];inline ll read(){ ll num = 0 , f = 1; char ch = getchar(); while(!isdigit(ch)){ if(ch == '-') f = -1; ch = getchar(); } while(isdigit(ch)){ num = num*10 + ch - '0'; ch = getchar(); } return num*f;}int main(){ memset(map , 2 , sizeof(map)); n in; m in; for(register int i=1;i<=m;i++){ u in; v in; map[u][v] = 1; f[0][u][v] = 1; } 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(f[l - 1][i][k] == 1 && f[l - 1][k][j] == 1){ f[l][i][j] = 1; map[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++) map[i][j] = min(map[i][j] , map[i][k] + map[k][j]); printf("%d" , map[1][n]);}//COYG
阅读全文
0 0
- 【倍增】[luoguP1613]跑路
- luoguP1613 跑路
- p1613 跑路(倍增)
- 【倍增】 luogu 1613 跑路
- 【luogu1613】跑路(倍增)
- 倍增
- 倍增
- 倍增
- 倍增
- 洛谷1613跑路(倍增)
- 跑路 洛谷1613 倍增 floyd
- 洛谷1613 跑路【倍增+floyd】
- 洛谷P1613 跑路(倍增+floyd)
- [练习][洛谷1613]倍增+Floyd 跑路
- 【洛谷1613】跑路 倍增+最短路
- 倍增时间 倍增...?
- 压力倍增
- 倍增排序
- ping 不通百度问题的解决
- ASP.NET HyperLink控件NavigateUrl中用到DataBinder.Eval时
- 天天学Linux命令37--vmstat命令
- eclipse android 提示 Program "sh" not found in PATH 编译错误
- Week
- 【倍增】[luoguP1613]跑路
- NS3命令行学习
- 【数据结构】面试搞定二叉树大总结-15道二叉树题
- ping 和telnet
- 手把手教你配置阿里云服务器搭建网站
- IDEA 2017 在线激活
- 马云发文称自己是灵魂歌手;雷军将投入230亿建设小米武汉总部丨价值早报
- 创投日报:10月13日至15日收录投融资项目22起
- 实现基于SSL的FTPS