https://www.acwing.com/problem/content/849/
方法一:用数组模拟队列
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e5+10;
int n,m;//n个点 m 条边
int h[N],e[N],ne[N],idx;
int q[N],d[N],hh,tt; //d[n] 存储每个节点离起点的距离
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int bfs()
{
memset(d,-1,sizeof d);
q[0]=1;//将1号点入队
d[1]=0;
while(hh<=tt)
{
int t=q[hh++]; //取出队列头部节点,且头部节点出队
for(int i=h[t];i!=-1;i=ne[i]) //遍历t节点的每一个邻边
{
int j=e[i]; //如果j没有被扩展过
if(d[j]==-1)
{
d[j]=d[t]+1; //d[j]存储j节点离起点的距离,并标记为访问过
q[++tt] = j; //把j结点 压入队列
}
}
}
return d[n];
}
int main(void)
{
cin>>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;
}
方法二: 用queue
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=1e5+10;
int n,m;
int h[N],e[N],ne[N],idx;
int d[N];
void add(int a,int b)
{
e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int bfs()
{
memset(d,-1,sizeof d);
queue<int> q; q.push(1);
d[1]=0;
while(!q.empty())
{
int t=q.front(); q.pop();
for(int i=h[t];i!=-1;i=ne[i])
{
int j=e[i];
if(d[j]==-1)
{
d[j]=d[t]+1;
q.push(j);
}
}
}
return d[n];
}
int main(void)
{
cin>>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;
}