直接找2的幂次的距离不好找
但可以通过递推从低次找到高次
0次即是初始
在中间点更新(Floyd)加一维更新幂次
Floyd用于中间点更新两点最短距离
#include<bits/stdc++.h>
using namespace std;
bool f[55][55][61];
long long dis[55][55];
int n,m,u,v;
int main ()
{
cin>>n>>m;
memset(dis,0x3f3f3f3f,sizeof(dis));
for(int i=1;i<=m;++i)
{
cin>>u>>v;
f[u][v][0]=1;
dis[u][v]=1;
}
for(int p=1;p<=60;++p)
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][p-1]&&f[k][j][p-1])
f[i][j][p]=1,dis[i][j]=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][k]+dis[k][j]<dis[i][j])
dis[i][j]=dis[i][k]+dis[k][j];
}
printf("%lld",dis[1][n]);
return 0;
}