多源BFS

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

文章目录

前言

一、多源BFS

二、AcWing 173. 矩阵距离

本题分析

AC代码

三、时间复杂度


前言

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


一、多源BFS

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


二、AcWing 173. 矩阵距离

本题链接:AcWing 173. 矩阵距离

本博客提供本题截图:

image.png

本题分析

本题的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的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。


目录
相关文章
|
前端开发 数据可视化 JavaScript
现代前端开发:掌握关键技术与趋势
【10月更文挑战第7天】现代前端开发:掌握关键技术与趋势
243 0
|
机器学习/深度学习 并行计算 PyTorch
PyTorch与CUDA:加速深度学习模型训练的最佳实践
【8月更文第27天】随着深度学习应用的广泛普及,高效利用GPU硬件成为提升模型训练速度的关键。PyTorch 是一个强大的深度学习框架,它支持动态计算图,易于使用且高度灵活。CUDA (Compute Unified Device Architecture) 则是 NVIDIA 开发的一种并行计算平台和编程模型,允许开发者直接访问 GPU 的并行计算能力。本文将详细介绍如何利用 PyTorch 与 CUDA 的集成来加速深度学习模型的训练过程,并提供具体的代码示例。
1512 1
|
机器学习/深度学习 存储 人工智能
神经网络算法 —— 一文搞懂Transformer !!
神经网络算法 —— 一文搞懂Transformer !!
1978 0
|
缓存 资源调度 JavaScript
npm 和 Yarn:一场关于包管理的战争(下)
npm 和 Yarn:一场关于包管理的战争(下)
npm 和 Yarn:一场关于包管理的战争(下)
|
C语言 C++
Visual Studio 2019 详细安装教程(图文版)
下载安装包 官网下载安装包 百度网盘下载安装包 安装步骤 运行并创建一个项目 【官网下载安装包步骤有些繁琐,官网反应速度有点慢】 【建议直接从百度网盘继续下载安装包!!!】
10110 25
|
机器学习/深度学习 人工智能 BI
深度学习入门基础CNN系列——卷积计算
卷积是数学分析中的一种积分变换的方法,在图像处理中采用的是卷积的离散形式。这里需要说明的是,在卷积神经网络中,卷积层的实现方式实际上是数学中定义的**互相关 (cross-correlation)运算**,与数学分析中的卷积定义有所不同,这里跟其他框架和卷积神经网络的教程保持一致,都使用互相关运算作为卷积的定义,具体的计算过程如 **图** 所示。
深度学习入门基础CNN系列——卷积计算
|
弹性计算 负载均衡 小程序
阿里云免费服务器申请2核4G、4核8G配置教程
2023阿里云免费服务器申请2核4G、4核8G配置教程,阿里云服务器免费试用申请链接入口,阿里云个人用户和企业用户均可申请免费试用,最高可以免费使用3个月,阿里云服务器网分享阿里云服务器免费试用申请入口链接及云服务器配置
748 0
|
数据采集 小程序 数据挖掘
个人开发者如何申请微信小程序
从午饭后开始下载开发工具、看文档,花了一下午开发完,晚上又折腾了下服务器域名配置的小问题,然后提交审核。要等审核完才能对外发布。
|
前端开发 JavaScript 编译器
尤大都说Vue3 + script setup + TS + Volar真香,你说香不香?(上)
相信你已经开始使用或者迫不及待地想尝试Vue3.2了,其实我群里的小伙伴早已经开始使用,而且踩了很多坑了,今天给大家分享一下他的实践投稿文章,希望大家多多支持!
1079 0