(1)模板
当题目中每条边的权重为1时,才能使用BFS解决最短路问题
起始状态插入队列(1号点插入队列)
while(队列不空)
{
t记录队头元素
扩展t可到达的位置x,放入队列
if(x没有被遍历过)
{
x入队
更新x到达目标的距离d[x]=d[t]+1
}
}
(2)题目
原题链接:https://www.acwing.com/problem/content/849/
(3)题目理解
(4)思路:
按照邻接表的形式存储节点,按格式添加节点后完成图的构建,和844. 走迷宫问题一样是图的广度优先遍历。要先,初始化所有节点到起点的距离为-1,将节点1放入队列中,添加节点1到起点的距离后,只要对列不为空就执行循环,找下一步可以到达的位置,这样就实现了图的遍历。循环中首先取出队头t,利用循环找 t 可以到达的位置,只要该位置没有被遍历过就将该位置放入队列,并更新其到起点的距离,直到t没有可以到达的位置,那么就会重新定位到新的队头。
(5)代码
# include <iostream>
# include <cstring>
using namespace std;
const int N = 1e5+10;
int h[N],e[N],ne[N],idx;
int d[N];//存储每个节点到起点的距离
int q[N];//存储当前队头可扩展的节点
int n,m,a,b;
void add(int a,int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int bfs()
{
int hh = 0,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])//扩展t可到达的节点j,放入队列
{
int j = e[i];
if(d[j] == -1){
d[j] = d[t] + 1;//节点入队
q[++tt] = j;//添加该节点距起点的位置
}
}
}
return d[n];
}
int main(){
memset(h,-1,sizeof h);//初始化头链表
cin>>n>>m;
for(int i=0;i<m;i++){
cin>>a>>b;
add(a,b);
}
cout<<bfs()<<endl;
return 0;
}