用了floyd,倍增算法,看数据挺小的,直接用矩阵存图
#include<bits/stdc++.h>
using namespace std;
const int M=100;
int dis[M][M],m,n;
int AK[M][M][20];
void div(){
for(int k=1;k<=20;k++)
for(int i=1;i<=n;i++)
for(int t=1;t<=n;t++)
for(int j=1;j<=n;j++)
if(AK[i][t][k-1]&&AK[t][j][k-1]){
AK[i][j][k]=1;
dis[i][j]=1;
}
}
void floyd(){
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
dis[i][j]=min(dis[i][j],dis[i][k]+dis[j][k]);
}
int main(){
memset(AK,0,sizeof(AK));
memset(dis,10,sizeof(dis));
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
dis[x][y]=1;
AK[x][y][0]=true;
}
div();
floyd();
printf("%d",dis[1][n]);
return 0;
}