#include<bits/stdc++.h>
#define ll long long
#define ld long double
#define rep(x,a,b) for(int x=(a);x<=(b);++x)
#define rop(x,a,b) for(int x=(a);x<(b);++x)
#define per(x,a,b) for(int x=(a);x>=(b);--x)
#define pb push_back
using namespace std;
const int N = 60;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
ll llread(){
ll x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
return x*f;
}
int n, m, head[N], ecnt;
int f[N][N][55], d[N][N];
struct Edge{
int to, nxt;
}e[N<<1];
void addedge( int u , int v ){
e[++ecnt] = (Edge){v,head[u]};
head[u] = ecnt;
}
int main(){
n = read();m = read();
memset(d,0x3f,sizeof(d));
for( int i = 1, u, v ; i <= m ; ++i ){
u = read();v = read();
addedge(u,v);
f[u][v][0] = 1;
d[u][v] = 1;
}
for( int p = 1 ; p <= 55 ; ++p ){
for( int i = 1 ; i <= n ; ++i ){
for( int j = 1 ; j <= n ; ++j ){
for( int k = 1 ; k <= n ; ++k ){
if( f[i][k][p-1] && f[k][j][p-1] ){
f[i][j][p] = 1;
d[i][j] = 1;
}
}
}
}
}
for( int j = 1 ; j <= n ; ++j ){
for( int i = 1 ; i <= n ; ++i ){
for( int k = 1 ; k <= n ; ++k ){
d[i][j] = min(d[i][j],d[i][k] + d[k][j]);
}
}
}
cout << d[1][n] << "\n";
return 0;
}
为啥就是少一呢 WA on #2, #10 记录https://www.luogu.com.cn/record/200280605