AcWing 847. 图中点的层次
原题链接
简单
作者:
满目星河_0
,
2021-03-31 12:33:51
,
所有人可见
,
阅读 140
带注释(超详细)
//算法思想:用队列实现bfs,用数组d来记录距离,第一次搜到某个点的时候,就是起点到这个
//点的最短距离
//注意:一定要搞清楚h,e,ne数组里面存的是什么,还有q队列里存的是什么
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int h[N],e[N],ne[N],idx;
//e数组才是各个点的序号
//h数组用来存储各个链表的头节点,他的值是idx
//ne的值也是idx,h数组和ne数组的作用就是用数组实现了链表。
int m,n;
int q[N],d[N];
//队列q用来存储各个点的序号,数组d用来存储各个点到起点的距离
void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
int bfs(){
int hh=0,tt=0;//如果是hh先加,则tt=0
memset(d,-1,sizeof(d));//将距离初始为1
q[0]=1;//初始队列只有一个序号1
d[1]=0;//序号1到自己的距离为0
while(hh<=tt){
int t=q[hh++];
for(int i=h[t];i!=-1;i=ne[i]){
int j=e[i]; //注意,e数组里面存储的才是各个点的序号
if(d[j]==-1){
d[j]=d[t]+1;
q[++tt]=j;//这里必须是++tt,不能是tt++,否则会把队列里的元素覆盖掉。
}
}
}
return d[n];
}
int main(){
cin>>n>>m;
memset(h,-1,sizeof(h));//一定要先初始化h,才能add
int a,b;
while(m--){
cin>>a>>b;
add(a,b);
}
cout<<bfs();
return 0;
}