n是编号
![](https://i-blog.csdnimg.cn/blog_migrate/541339da0f28b0d57456d2d7a48026e6.png)
代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
#include<cmath>
using namespace std;
const int N = 100010;
int n,m;
int h[N],e[N],ne[N],idx;//邻接表
int d[N],q[N];//距离和队列
void add(int a,int b){
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
int bfs(){
int hh = 0,tt = 0;
q[0] = 1;//将第一个点放入
memset(d,-1,sizeof d);
d[1] = 0;
while(hh <= tt){
int t = q[hh++];
for(int i=h[t];i != -1;i = ne[i]){
int j=e[i];
if(d[j] == -1){
//还没到达过,因为用的是队列的形式
//所以第一次到达就是最小值
d[j] = d[t] + 1;
q[++ tt] = j;//将j放进队列
}
}
}
return d[n];//1 号点到 n 号点的最短距离。
}
int main()
{
scanf("%d%d",&n,&m);
memset(h,-1,sizeof(h));
for(int i=0;i<m;i++){
int a,b;
cin>>a>>b;
add(a,b);
}
cout<<bfs()<<endl;
return 0;
}