多源BFS

本文介绍了多源BFS的基本概念,通过实例演示如何在AcWing平台上的173号题目中应用此算法,计算每个点到数字1点的最短距离。同时提到了时间复杂度暂未详述,后续将补充。重点在于BFS策略的调整和代码实现。
摘要由CSDN通过智能技术生成


前言

复习acwing算法提高课的内容,本篇为讲解算法:多源BFS,关于时间复杂度:目前博主不太会计算,先鸽了,日后一定补上。


一、多源BFS

拿例题来讲,本题求的是每一个点距离数字为1的点的最短距离,而一个图中存在多个为1的点,这样来看的话,如果我们和普通的bfs解法一样,只把第一个为1的点放入队列之中去更新其他点的距离的话,显然是不和法的,所以我们要把所有为1的点都加入到队列之中,这种做法,我们称之为多源BFS


二、AcWing 173. 矩阵距离

本题链接:AcWing 173. 矩阵距离
本博客提供本题截图:
在这里插入图片描述

本题分析

本题的dist数组除了要负责记录距离,还需要实现判重的功能,具体操作为初始化为-1,因为dist数组要被更新,所以如果一个点的dist的值为-1的话,证明这个点没有被更新,反之则被更新,注意和单源BFS不同的是,我们需要把每一个值为1的点加入到我们的队列中。

AC代码

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>

#define x first
#define y second

using namespace std;

typedef pair<int, int> PII;

const int N = 1010, M = N * N;

PII q[M];
int dist[N][N];
char g[N][N];
int n, m;

void bfs()
{
    memset(dist, -1, sizeof dist);
    
    int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0};
    
    int hh = 0, tt = -1;
    for (int i = 0; i < n; i ++ )
        for (int j = 0; j < m; j ++ )
            if (g[i][j] == '1')
            {
                dist[i][j] = 0;
                q[++ tt] = {i, j};
            }
            
    while (hh <= tt)
    {
        auto t = q[hh ++];
        
        for (int i = 0; i < 4; i ++ )
        {
            int a = t.x + dx[i], b = t.y + dy[i];
            if (a < 0 || a >= n || b < 0 | b >= m) continue;
            if (dist[a][b] != -1) continue;
            
            dist[a][b] = dist[t.x][t.y] + 1;
            q[++ tt] = {a, b};
        }
    }
}

int main()
{
    scanf("%d%d", &n, &m);
    
    for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);
    
    bfs();
    
    for (int i = 0; i < n; i ++ )
    {
        for (int j = 0; j < m; j ++ )
            printf("%d ", dist[i][j]);
        puts("");
    }
        
    return 0;
}

三、时间复杂度

关于多源BFS的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰chen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值