Luogu_P1613 跑路 题解
发现和最短路差不多,不过不能朴素的跑最短路。考虑对于每两个相隔 的整数次幂的点建边,在这个新图上跑最短路就是答案。设 表示从点 跳 步能否到点 ,转移方程就是一个普通的倍增。如果点 和点 可以一步到达,那么就在新图上建一条长度为 的边。跑 Floyd 最短路即可。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 105;
int n, m, dis[MAXN][MAXN]; bool f[MAXN][MAXN][MAXN];
signed main(void) {
cin >> n >> m;
memset(dis, 0x3f, sizeof dis);
for (int i = 1; i <= m; ++i) {
int x, y;
cin >> x >> y;
dis[x][y] = f[x][y][0] = 1;
}
for (int k = 1; k < 105; ++k) {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
for (int l = 1; l <= n; ++l) {
if (f[j][i][k - 1] && f[i][l][k - 1]) {
dis[j][l] = f[j][l][k] = 1;
}
}
}
}
}
for (int k = 1; k <= n; ++k) {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
if (dis[i][j] > dis[i][k] + dis[k][j]) {
dis[i][j] = dis[i][k] + dis[k][j];
}
}
}
}
cout << dis[1][n] << endl;
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】