【算法】BFS解决最短路径问题

📢博客主页:https://blog.csdn.net/2301_779549673
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 JohnKi 原创,首发于 CSDN🙉
📢未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

在这里插入图片描述


📢前言


🏳️‍🌈一、概念

**BFS(广度优先搜索)**在图论算法中有着广泛的应用,尤其是在解决最短路径问题上表现出色。本文将详细介绍如何使用 C++ 实现 BFS 来解决最短路径问题。

广度优先搜索是一种用于图遍历的算法,它从起始节点开始,逐步探索其相邻节点,然后再探索相邻节点的相邻节点,以此类推。这种算法在解决最短路径问题时非常有用,因为它能够保证找到的路径是最短的。

在 C++ 中,可以使用队列来实现 BFS。队列的特点是先进先出,这与 BFS 的遍历方式相符合。首先,将起始节点加入队列,然后从队列中取出一个节点,探索其相邻节点,并将未访问过的相邻节点加入队列。重复这个过程,直到找到目标节点或者队列为空。

BFS 在解决各种实际问题中都有广泛的应用,比如迷宫问题、网络路由问题等。在迷宫问题中,BFS 可以用来找到从起点到终点的最短路径;在网络路由问题中,BFS 可以用来找到两个节点之间的最短路由。
接下来,我们将通过具体的代码示例来展示如何使用 C++ 实现 BFS 来解决最短路径问题。
在这里插入图片描述

🏳️‍🌈二、问题描述

以迷宫问题为例,在一张由 0 和 1 构成的图中,1 表示障碍,0 表示通路。给定起点 S 和终点 T,求从 S 到 T 的最短路长度并输出路径。

在解决这个问题时,我们可以使用广度优先搜索(BFS)算法。BFS 是一种用于图遍历的算法,它从起始节点开始,逐步探索其相邻节点,然后再探索相邻节点的相邻节点,以此类推。在迷宫问题中,我们可以将每个格子看作一个节点,相邻的格子之间有边相连。

首先,我们需要定义一个数据结构来表示迷宫。可以使用二维数组来存储迷宫的状态,其中 0 表示通路,1 表示障碍。同时,我们还需要定义一个队列来存储待探索的节点。队列的特点是先进先出,这与 BFS 的遍历方式相符合。

接下来,我们将起始节点加入队列,并标记为已访问。然后,从队列中取出一个节点,探索其相邻节点。如果相邻节点是通路且未被访问过,则将其加入队列,并标记为已访问。重复这个过程,直到找到目标节点或者队列为空。

在探索过程中,我们可以使用一个数组来记录每个节点到起始节点的距离。初始时,起始节点的距离为 0,其他节点的距离为无穷大。当探索到一个节点时,将其距离更新为上一个节点的距离加 1。这样,当找到目标节点时,我们就可以得到从起始节点到目标节点的最短路长度。

为了输出路径,我们可以在探索过程中记录每个节点的前驱节点。当找到目标节点时,从目标节点开始,沿着前驱节点回溯,直到到达起始节点,这样就可以得到从起始节点到目标节点的路径。

#include <iostream>
#include <queue>

const int maxn = 1010;
char mp[maxn][maxn];
int dist[maxn][maxn];
int n;
int sx, sy, tx, ty;
int dx[4]={
   
   1,0,0,-1}, dy[4]={
   
   0,-1,1,0};
char dir[4]={
   
   'D','L','R','U'};

void bfs() {
   
   
    for(int i = 0; i < n; i ++)
        for(int j = 0; j < n; j ++)
            dist[i][j]=1e9;
    dist[tx][ty]=0;
    std::queue<std::pair<int,int>> q;
    std::pair<int,int> t;
    t.first = tx;
    t.second = ty;
    q.push(t);
    while(q.size()) {
   
   
        t = q.front();
        q.pop();
        for(int i = 0; i < 4; i ++) {
   
   
            int nx = t.first + dx[i];
            int ny = t.second + dy[i];
            if(nx >= 0 && nx < n && ny >= 0 && ny < n && dist[nx][ny]==1e9 && mp[nx][ny]!='1') {
   
   
                dist[nx][ny]= dist[t.first
评论 54
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值