【题解】洛谷P1613: 跑路
首先你要看懂题目意思,只要距离为 \(2^k\) 都可以直接跳过去且花费时间为 \(1\) s,所以我们并不能直接跑最短路,可能你跑的最短路我跑路器一下就跳过去了。
因为性质为 \(2^k\) 所以可以考虑倍增,\(f_{i,j,k}\) 表示 \(i\) 到 \(j\) 可以通过 \(2^k\) 的跑路器到达,然后我们就可以将这两个点连一条权值为 \(1\) 的边,我们循环处理完所以点对后就可以 floyd 跑最短路了。
#include <bits/stdc++.h> #define int long long #define ls p<<1 #define rs p<<1|1 #define re register const int N=55; const int mod=998244353; using namespace std; int n,m; int f[N][N][N]; int dis[N][N]; signed main(){ ios::sync_with_stdio(false); cin.tie(nullptr); memset(dis,0x3f,sizeof dis); cin>>n>>m; for(int i=1;i<=m;i++){ int x,y; cin>>x>>y; dis[x][y]=1; f[x][y][0]=1; } for(int k=1;k<=25;k++){ for(int i=1;i<=n;i++){ for(int z=1;z<=n;z++){ for(int j=1;j<=n;j++){ if(f[i][z][k-1]&&f[z][j][k-1]){ f[i][j][k]=1; 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]); } } } cout<<dis[1][n]; return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!