才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;
}