分析
只要 x x x到 y y y, y y y到 z z z的权都是 2 k 2^k 2k,那么 x x x到 z z z的权就是 2 k + 1 2^{k+1} 2k+1,通过这样把可直接连通的点连边,边权为1,跑floyd即可
代码
#include <cstdio>
#include <cctype>
#include <cstring>
#define rr register
using namespace std;
typedef unsigned uit;
uit dis[51][51],n; bool dp[51][51][31];
inline uit iut(){
rr uit ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void minn(uit &a,uit b){if (a>b) a=b;}
signed main(){
n=iut(); memset(dis,42,sizeof(dis));
for (rr uit m=iut();m;--m){
rr uit x=iut(),y=iut();
dis[x][y]=dp[x][y][0]=1;
}
for (rr uit t=1;t<31;++t)
for (rr uit k=1;k<=n;++k)
for (rr uit i=1;i<=n;++i)
for (rr uit j=1;j<=n;++j)
if (dp[i][k][t-1]&&dp[k][j][t-1])
dp[i][j][t]=1,dis[i][j]=1;
for (rr uit k=1;k<=n;++k)
for (rr uit i=1;i<=n;++i)
for (rr uit j=1;j<=n;++j)
minn(dis[i][j],dis[i][k]+dis[k][j]);
return !printf("%u",dis[1][n]);
}