DFS之连通性模型

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介: 复习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之连通性模型的时间复杂度以及证明,后续会给出详细的说明以及证明过程,目前先鸽了。


相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
相关文章
DFS之剪枝与优化
DFS之剪枝与优化
77 0
|
1月前
DFS,BFS的连通性
DFS,BFS的连通性
25 0
|
3月前
|
算法
DFS算法的实现
DFS算法的实现
62 3
|
5月前
|
算法 索引
DFS算法及应用(二)
回溯:回溯就是DFS的一种,在搜索探索过程中寻找问题的解,当发现不满足求解条件时,就回溯返回,尝试其他路径。
|
5月前
|
算法
DFS算法及应用(一)
DFS(深度优先搜索)是一种图遍历算法,常用于解决穷举问题,如全排列、迷宫问题、图的连通性等。它沿着树的深度分支进行探索,直至达到叶子节点,若无法继续则回溯。例如,将数字6拆分为3个正整数的递增序列问题可以通过DFS实现,类似地,分糖果问题和买瓜问题同样可以用DFS求解。DFS通常涉及递归或栈结构,通过标记已访问节点避免重复。在编程中,会定义递归函数,设定结束条件,然后枚举可能的情况,并处理下一层节点。
|
6月前
|
分布式计算 监控 Hadoop
Hadoop节点扩展确保网络连通性
【4月更文挑战第19天】
64 4
|
6月前
|
分布式计算 Hadoop 测试技术
Hadoop节点网络性能的带宽测试
【4月更文挑战第23天】
101 1
|
弹性计算 分布式计算 网络协议
聊聊复杂网络环境下hdfs的BlockMissingException异常|参数dfs.client.use.datanode.hostname
企业真实的网络环境是复杂多变的,在复杂的网络环境中部署并使用 hadoop 时,如果服务端的配置或客户端的使用不当,就可能会遇见各种问题。
聊聊复杂网络环境下hdfs的BlockMissingException异常|参数dfs.client.use.datanode.hostname