你这 $floyd$ 应该赋初值memset(map,0x3f,sizeof(map))
直接用0去是不行的
by Rain_chr @ 2022-12-29 10:31:01
@[diamond_153](/user/751417) 并且你这floyd写假了,j在最外面
by Rain_chr @ 2022-12-29 10:33:44
帮你A了(map改成了mp,因为那是关键字,下次别用了)
```cpp
#include<bits/stdc++.h>
using namespace std;
bool f[65][51][51]={0};//f[i][j][k]: j,k之间有长度为2^i的路线
int mp[51][51]={0};//mp[i][j]: i,j之间的最短路
int n,m;
int main(){
memset(mp,0x3f,sizeof(mp));
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=0;i<m;i++){
int x,y;cin>>x>>y;
mp[x][y]=f[0][x][y]=1;//初始化
}
for(int i=1;i<=64;i++)
for(int u=1;u<=n;u++)
for(int v=1;v<=n;v++)
for(int w=1;w<=n;w++)
if(f[i-1][u][v]&&f[i-1][v][w])
mp[u][w]=f[i][u][w]=1;//初始化,运用倍增思想
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(mp[i][j]+mp[j][k]<mp[i][k])
mp[i][k]=mp[i][j]+mp[j][k];//floyd,这里的 (!mp[i][k]||mp[i][j]+mp[j][k]<mp[i][k]) 的意思是i,k之间没有路或者i,k之间的路不是最优
cout<<mp[1][n];//从1到n的最短路
}
```
by Rain_chr @ 2022-12-29 10:35:38
@[违规用户名684254](/user/684254) 其实map你不 `#include<map>` 也能用,不过%%%
by diamond_153 @ 2022-12-29 10:49:30