P1613 跑路 (最短路,倍增)
2024-09-04 07:18:22
题目链接
Solution
发现 \(n\) 只有 \(50\), 可以用 \(floyd\) .
然后 \(w[i][j][l]\) 代表 \(i\) 到 \(j\) 是否存在 \(2^l\) 长的路.
四重循环,枚举即可.如果有则更新 \(dis[i][j]\) 为 \(1\) .
然后再跑 \(floyd\) 即可.
不过注意枚举 \(l\) 的这一层要大一点,到 \(50\) 左右.
Code
#include<bits/stdc++.h>
typedef int _int;
#define int long long
using namespace std;
int w[51][51][51];
int n,m,dis[51][51];
_int main()
{
scanf("%lld%lld",&n,&m);
memset(dis,0x3f,sizeof(dis));
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%lld%lld",&x,&y);
w[x][y][0]=1;
dis[x][y]=1;
}
for(int l=1;l<=50;l++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
if(i!=j&&j!=k&&i!=j)
if(w[i][k][l-1]&&w[k][j][l-1])
w[i][j][l]=1,dis[i][j]=1;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
for(int k=1;k<=n;k++)
if(i!=j&&j!=k&&i!=j)
dis[i][j]=min(1ll*dis[i][j],1ll*dis[i][k]+dis[k][j]);
cout<<dis[1][n]<<endl;
return 0;
}
最新文章
- 开启基本数据结构和算法之路--初识Graphviz
- 项目vue2.0仿外卖APP(五)
- No module named migrate.versioning
- java 24 - 2 GUI之监听机制和适配器改进窗口关闭
- [原]Android打包之Gradle打包
- 经典SQL语句大全.doc
- Ants(思维)
- Web APIs 基于令牌TOKEN验证的实现
- sed正则表达式
- php学习之路:WSDL详细解释(两)
- 使用JS动态修改网页body的背景色
- JAVA之旅(十五)——多线程的生产者和消费者,停止线程,守护线程,线程的优先级,setPriority设置优先级,yield临时停止
- [Swift]LeetCode916.单词子集 | Word Subsets
- react native环境搭建与生命周期
- [日常] Go语言圣经--结构体,JSON习题
- 【QT5】 第一个hello world 程序
- CI/CD系列
- js &; get recursive ids
- Spring4笔记12--SSH整合3--Spring与Struts2整合
- HDU 5536--Chip Factory(暴力)