DFS之连通性模型

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

文章目录

前言

一、DFS

二、例题,代码

AcWing 1112. 迷宫

本题分析

AC代码

DFS

BFS

AcWing 1113. 红与黑

本题分析

AC代码

DFS

BFS

三、时间复杂度


前言

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


一、DFS

深度优先搜索,基础的模板我们已经讲过,见:DFS,在这里不做过多赘述,本文主要针对一些dfs的类型题目做相应的讲解


二、例题,代码

AcWing 1112. 迷宫

本题链接:AcWing 1112. 迷宫

本博客提供本题截图:

image.png

image.png

本题分析

dfs的板子题,注意题目中的坑:A,B不一定是两个不同的点,起点和终点也可能是'#'

AC代码

DFS

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int k, n, la, ha, lb, hb;
char g[N][N];
bool st[N][N];
bool dfs(int x, int y)
{
    if (g[x][y] == '#') return false;
    if (x == hb && y == lb) return true;
    int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
    st[x][y] = true;
    for (int i = 0; i < 4; i ++ )
    {
        int a = x + dx[i], b = y + dy[i];
        if (a < 0 || a >= n || b < 0 || b >= n) continue;
        if (st[a][b]) continue;
        if (dfs(a, b)) return true;
    }
    return false;
}
int main()
{
    scanf("%d", &k);
    while (k -- )
    {
        scanf("%d", &n);
        for (int i = 0; i < n; i ++ ) scanf("%s", g[i]);
        scanf("%d%d%d%d", &ha, &la, &hb, &lb);
        memset(st, false, sizeof st);
        if (dfs(ha, la)) puts("YES");
        else puts("NO");
    }
    return 0;
}

BFS

#include <cstdio>
#include <cstring>
#include <map>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 110, M = N * N;
PII q[M];
char g[N][N];
bool st[N][N];
int k, n, ha, la, hb, lb;
bool bfs()
{
    if (g[ha][la] == '#') return false;
    if (la == lb && ha == hb) return true;
    int dx[4] = {0, -1, 0, 1}, dy[4] = {-1, 0, 1, 0};
    int hh = 0, tt = 0;
    q[0] = {ha, la};
    st[ha][la] = true;
    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 >= n) continue;
            if (st[a][b] || g[a][b] == '#') continue;
            if (a == hb && b == lb) return true;
            q[++ tt] = {a, b};
            st[a][b] = true;
        }
    }
    return false;
}
int main()
{
    scanf("%d", &k);
    while (k -- )
    {
        scanf("%d", &n);
        for (int i = 0; i <n; i ++ ) scanf("%s", g[i]);
        scanf("%d%d%d%d", &ha, &la, &hb, &lb);
        memset(st, false, sizeof st);
        if (bfs()) puts("YES");
        else puts("NO");
    }
    return 0;
}

AcWing 1113. 红与黑

本题链接:AcWing 1113. 红与黑

本博客提供本题截图:

image.png

image.png

本题分析

其实就是Flood Fill算法的dfs写法

AC代码

DFS

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 25;
int n, m;
char g[N][N];
bool st[N][N];
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int dfs(int x, int y)
{
    int cnt = 1;
    st[x][y] = true;
    for (int i = 0; i < 4; i ++ )
    {
        int a = x + dx[i], b = y + dy[i];
        if (a < 0 || a >= n || b < 0 || b >= m) continue;
        if (st[a][b]) continue;
        if (g[a][b] == '#') continue;
        cnt += dfs(a, b);
    }
    return cnt;
}
int main()
{
    while (cin >> m >> n, n || m)
    {
        memset(st, false, sizeof st);
        for (int i = 0; i < n; i ++ )
            cin >> g[i];
        int x, y;
        for (int i = 0; i < n; i ++ )
            for (int j = 0; j < m; j ++ )
                if (g[i][j] == '@')
                {
                    x = i;
                    y = j;
                    break;
                }
        cout << dfs(x, y) << endl;
    }
    return 0;
}

BFS

就是Flood Fill算法

三、时间复杂度

关于DFS之连通性模型的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
11月前
|
设计模式 人工智能
AI辅助编程:常用的7种Prompt模式
DevGPT数据集收录了使用ChatGPT进行辅助编程的2万余条提示语及回答;基于该数据集的总结发现了7种常用的提示语模式
475 2
AI辅助编程:常用的7种Prompt模式
|
9月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
694 0
|
机器学习/深度学习 资源调度 数据可视化
YOLOv11改进策略【注意力机制篇】| 引入Shuffle Attention注意力模块,增强特征图的语义表示
YOLOv11改进策略【注意力机制篇】| 引入Shuffle Attention注意力模块,增强特征图的语义表示
717 1
YOLOv11改进策略【注意力机制篇】| 引入Shuffle Attention注意力模块,增强特征图的语义表示
|
机器学习/深度学习 数据采集 人工智能
AI在用户行为分析中的应用:实现精准洞察与决策优化
AI在用户行为分析中的应用:实现精准洞察与决策优化
1915 15
|
数据可视化 项目管理 数据库
提高工作效率:5个实用的SOP模板与技巧
SOP(标准操作程序)是将工作流程标准化,明确每一步骤、责任人及时间要求,以提高效率、减少错误并增强团队协作。初入职场者掌握SOP,能更快适应环境,提升个人与团队的工作表现。
4912 1
提高工作效率:5个实用的SOP模板与技巧
|
存储 并行计算 C++
NVIDIA Triton系列08-用户端其他特性
本文详细解析了NVIDIA Triton开源项目的image_client.py示例代码,涵盖指定通信协议(HTTP与gRPC)、调用异步模式与数据流处理、以及使用共享内存等核心功能,为开发者提供撰写Triton用户端应用的指导。通过具体代码示例,帮助读者理解如何高效利用Triton服务器进行模型推理。
467 1
NVIDIA Triton系列08-用户端其他特性
|
自动驾驶 vr&ar 开发者
把Waymo玩成GTA游戏!全生成式的车辆行驶轨迹视频合成器来了
FreeVS(Free View Synthesis)是一种创新技术,能够在真实驾驶场景中合成车辆的摄像头视角视频,不仅限于已知轨迹,还能生成全新轨迹上的视频。它采用伪图像表示和视角变换模拟技术,突破了传统方法对已知轨迹的依赖,提升了自动驾驶技术的测试和验证能力。实验结果显示,FreeVS在Waymo Open Dataset上表现出色,具有广泛的应用前景。论文链接:https://arxiv.org/abs/2410.18079
491 16
|
缓存 NoSQL 数据库
用 Python 进行数据库查询优化
在数据量较大的情况下,数据库查询的性能可能会成为系统性能的瓶颈。为了提高查询速度和效率,需要对查询进行优化。在 Python 中,我们可以采取一些策略来优化数据库查询。
|
SQL 存储 BI
什么是视图?详细解析与应用指南
【8月更文挑战第31天】
2853 0
|
域名解析 Web App开发 缓存
DNS 预解析是什么?怎么实现?
DNS 预解析是什么?怎么实现?
1351 2