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


目录
相关文章
|
5月前
多源BFS+最小步数模型+双端队列广搜
多源BFS+最小步数模型+双端队列广搜
28 0
|
8月前
|
算法 C++
【BFS】魔板(c++基础算法)
【BFS】魔板(c++基础算法)
89 0
|
8月前
|
算法 C++
【BFS】八数码问题(c++基础算法)
【BFS】八数码问题(c++基础算法)
131 0
|
8月前
|
算法 安全 Android开发
LeetCode 周赛上分之旅 # 37 多源 BFS 与连通性问题
学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场 LeetCode 周赛的解题报告,一起体会上分之旅。
31 0
|
8月前
|
算法 机器人 C语言
【算法基础】深搜(上)
【算法基础】深搜(上)
57 0
|
8月前
|
人工智能 算法 机器人
【算法基础】深搜(下)
【算法基础】深搜(下)
65 0
|
人工智能 算法 BI
LeetCode 周赛 341 场,模拟 / 树上差分 / Tarjan 离线 LCA / DFS
上周末有单双周赛,双周赛我们讲过了,单周赛那天早上有事没参加,后面做了虚拟竞赛,然后整个人就不好了。前 3 题非常简单,但第 4 题有点东西啊,差点就放弃了。最后,被折磨了一个下午和一个大夜总算把第 4 题做出来了,除了新学的 Tarjon 离线算法,这道题还涉及到树上差分、前缀和、DFS、图论等基础知识,几度被折磨得想要放弃。这种感觉,似乎和当年在 LeetCode 上做前 10 题的时候差不多哈哈。
66 0
|
算法 定位技术
BFS算法模板与练习
BFS算法模板与练习
82 0
|
算法 定位技术
给我5分钟,带你秒杀所有图算法之DFS、BFS
给我5分钟,带你秒杀所有图算法之DFS、BFS
给我5分钟,带你秒杀所有图算法之DFS、BFS
Codeforces987D(逆向思维多源BFS)
Codeforces987D(逆向思维多源BFS)
90 0

热门文章

最新文章