【ACwing】三、 搜索与图论:树与图的广度优先遍历—— 847. 图中点的层次

(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;
}

复盘易出错的位置

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值