代码如下:
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 1e5 + 10;
int e[N], ne[N], h[N], idx;
int d[N], q[N]; //d用来存储每个位置到1号点的距离,q用来做模拟队列将符合条件的结点入队
int n, m;
void insert(int a, int b) //头插法
{
e[idx] = b;
ne[idx] = h[a];
h[a] = idx++;
}
int bfs()
{
int hh = 0, tt = 0;
q[0] = 1; //从1开始层次遍历,符合条件的入队
memset(d, -1, sizeof d);
d[1] = 0; //首先1离1的位置当然是0
while(hh<=tt)
{
int k = q[hh++]; //取对头元素
for (int i = h[k]; i != -1; i=ne[i])
{
int j = e[i]; //遍历有向图的那一条方向的路径
if (d[j] == -1) //如果这个几点距离1号结点为-1表示没走过
{
d[j] = d[k] + 1; //跟新为到1号元素的距离
q[++tt] = i; //并将其入队
}
}
}
return d[n]; //返回指定元素距离1号元素的距离
}
int main()
{
cin >> n >> m;
memset(h, - 1, sizeof h);
while (m--)
{
int a, b;
cin >> a >> b;
insert(a, b);
}
cout << bfs() << endl;
return 0;
}
算法小白的学习笔记。