AcWing 847. 图中点的层次-详细注释
原题链接
简单
作者:
现代修士o_O
,
2021-04-28 10:26:19
,
所有人可见
,
阅读 147
#include <cstring>
#include <iostream>
using namespace std;
const int N = 100010;
//n个结点,m条边
int n, m;
//邻接表四件套
//h[i] 编号为i的结点指向的下一个结点的下标
//e[i] 下标为i的结点在图中的编号
//ne[i] 下标为i的结点的下一个结点的下标
//idx 管理结点的下标,使其不重复
int h[N], e[N], ne[N], idx;
//bfs两件套
//d[i] 既表示下标为i的结点是否遍历过,又表示它与初始结点的距离
//q[N] 代表队列,队尾放入,队头放出
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 = -1;
q[ ++ tt] = 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;
}
}
}
return d[n];
}
int main()
{
cin >> n >> m;
memset(h, -1, sizeof h);//初始化,邻接表,一定要在add之前初始化
for (int i = 0; i < m; i ++ )
{
int a, b;
cin >> a >> b;
add(a, b);
}
cout << bfs() << endl;
return 0;
}