直接找2的幂次的距离不好找
但可以通过递推从低次找到高次
0次即是初始
在中间点更新(Floyd)加一维更新幂次
Floyd用于中间点更新两点最短距离
跑路 - 洛谷
#includeusing 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]



