当前位置: 首页 > news >正文

P1613 跑路

题目

P1613 跑路

算法标签: 倍增, 动态规划, 最短路

思路

题目给定 2 k 2 ^ k 2k步内都可以 1 1 1秒到达, 因此可以定义一个状态 f [ k ] [ i ] [ j ] f[k][i][j] f[k][i][j]表示是否存在一条长度为 2 k 2 ^ k 2k的路径使得 i i i能走到 j j j, 观察数据范围, 点的数量是 50 50 50, 可以直接枚举三个点, 计算出 f f f数组, 如果能到达将两个点直接距离标记为 1 1 1, 然后求最短路即可

代码

#include <iostream>
#include <algorithm>
#include <cstring>using namespace std;typedef unsigned long long ULL;
const int N = 60, M = 1e4 + 10, K = 65;int n, m;
int f[K][N][N], d[N][N];int main() {ios::sync_with_stdio(false);cin.tie(0), cout.tie(0);cin >> n >> m;memset(d, 0x3f, sizeof d);for (int i = 1; i <= n; ++i) d[i][i] = 0;for (int i = 0; i < m; ++i) {int u, v;cin >> u >> v;d[u][v] = 1;f[0][u][v] = 1;}for (int k = 1; k < K; ++k) {for (int i = 1; i <= n; ++i) {for (int t = 1; t <= n; ++t) {for (int j = 1; j <= n; ++j) {if (f[k - 1][i][t] && f[k - 1][t][j]) {f[k][i][j] = 1;d[i][j] = min(d[i][j], 1);}}}}}for (int k = 1; k <= n; ++k) {for (int i = 1; i <= n; ++i) {for (int j = 1; j <= n; ++j) {d[i][j] = min(d[i][j], d[i][k] + d[k][j]);}}}int ans = d[1][n];cout << ans << "\n";return 0;
}

相关文章:

  • pcl::PointCloud2 的结构与sensor_msgs::msg::PointCloud2一样,pcl::PointCloud<T>
  • LLM 对齐新范式:深入解析 DPO (Direct Preference Optimization) 的原理与实践
  • RISC-V特权模式及切换
  • [Java恶补day9] 438.找到字符串中所有字母异位词
  • 202505系分论文《论信息系统开发方法及应用》
  • 决胜2025:企业级BI产品深度评测与选型指南
  • pip国内镜像源配置
  • 数值积分实验
  • el-table配置表头固定而且高度变化
  • Linux下基本指令的介绍
  • 【芯片设计- SoC 常用模块 9.1 -- PLL 介绍】
  • Redis集群大Key问题深度解决方案
  • 深入解析 IP 代理:原理、应用场景与优化策略
  • 操作系统导论 第37章:磁盘驱动器
  • 脑机新手指南(一):BCILAB 脑机接口工具箱新手入门指南
  • 面试高频图论题『墙与门』:Swift BFS 解法全流程拆解
  • STM32学习第一课--工程建立(云端备份与自我复盘)
  • 回归任务损失函数对比曲线
  • git 一台电脑一个git账户,对应多个仓库ssh
  • 将can日志数据提取到excle中
  • 网站建设模板购买/seo流量排名工具
  • 网站历史记录怎么恢复/链接交换公司
  • 怎么做网站知乎/营业推广的形式包括
  • 帮别人设计网站/百度百度一下你就知道主页
  • 网站描述设置/seo学徒招聘
  • 标签系统做的好的网站/外贸展示型网站建设公司