才50,时间复杂度可能是
,也就是
或者
//
是数的最大值
因为和倍增有关,所以猜测。
这么奇葩的时间复杂度,只有
了。
也就是两遍了
第一遍,倍增求出所有用十分牛B的空间跑路器能在1点时间从
到
,也就是长度为
都为1
第二遍,求出最短路
——————————————————————————————————————————————————
Q:倍增是……?
A:我给它取的名字,再加一维k,表示
——
长度是否为
,
&
本质就是动态规划
#include<cstdio>
#include<iostream>
using namespace std;
const int N=100;
int n,m,g[N][N];
bool f[N][N][N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) g[i][j]=1e9;
for(int i=1;i<=m;i++)
{
int u,v; scanf("%d%d",&u,&v);
f[u][v][0]=g[u][v]=1;
}
for(int t=1;t<=60;t++)
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(f[i][k][t-1]&f[k][j][t-1])
f[i][j][t]=g[i][j]=1;
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++) g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
printf("%d",g[1][n]);
return 0;
}
本文深入探讨了一种名为“倍增”的动态规划算法,该算法用于求解特定类型的最短路径问题。通过实例讲解了如何利用倍增算法在复杂图中高效地找到两点之间的最短路径,并附带详细代码实现。
7506

被折叠的 条评论
为什么被折叠?



