c++红与黑(DFS之连通性模型)

这篇具有很好参考价值的文章主要介绍了c++红与黑(DFS之连通性模型)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

连通性是图论中一个重要的概念,用于描述图中的点与点之间是否存在路径。在连通图中,任意两个点之间都存在至少一条路径。而在非连通图中,存在一些点与其它点没有连通的路径。

在使用深度优先搜索(DFS)算法解决图论问题中,连通性模型是一个经典且重要的应用场景。简单来说,连通性模型就是通过 DFS 算法判定一幅图是否是连通图。具体实现过程中,我们可以从一个起点开始遍历整个图,标记遍历到的节点为已访问,若最终遍历到的节点数量等于图中节点总数,则说明整个图是连通的;反之,如果存在未遍历到的节点,则说明图是非连通的。

通过连通性模型,我们可以解决一些和图连通性有关的问题,例如:

- 问一个图是否是连通图;
- 求一个图中有多少个连通分量;
- 求一个图中任意两个点之间的距离。

这些问题都可以通过 DFS 算法来解决,其中连通性模型是基础且重要的部分,因此深入掌握该模型对于理解和解决图论问题非常有帮助。

先看题目:

有一间长方形的房子,地上铺了红色、黑色两种颜色的正方形瓷砖。

你站在其中一块黑色的瓷砖上,只能向相邻(上下左右四个方向)的黑色瓷砖移动。

请写一个程序,计算你总共能够到达多少块黑色的瓷砖。

输入格式
输入包括多个数据集合。

每个数据集合的第一行是两个整数 W 和 H,分别表示 x 方向和 y 方向瓷砖的数量。

在接下来的 H 行中,每行包括 W 个字符。每个字符表示一块瓷砖的颜色,规则如下

1)‘.’:黑色的瓷砖;
2)‘#’:红色的瓷砖;
3)‘@’:黑色的瓷砖,并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。

当在一行中读入的是两个零时,表示输入结束。

输出格式
对每个数据集合,分别输出一行,显示你从初始位置出发能到达的瓷砖数(记数时包括初始位置的瓷砖)。

数据范围
1≤W,H≤20

输入数据:

6 9 
....#. 
.....# 
...... 
...... 
...... 
...... 
...... 
#@...# 
.#..#. 
0 0

输出数据

45

注意:其实这题也可以用bfs做,但是可以用dfs,代码量可以减少,更方便理解和解题,所以我们在既可以用dfs,也可以用bfs,一般选择dfs

老规矩,先看代码

#include<cstring>
#include<iostream>
#include<algorithm>

using namespace std;

const int N = 25;

int n, m;
char g[N][N];
bool st[N][N];

int dx[] = {-1, 0, 1, 0}, dy[] = {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, m || n)
    {
        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;
                }
            }
        }
        
        memset(st, 0, sizeof st);
        
        cout<< dfs(x, y) << endl;
    }
    
    return 0;
}

1、注意输出格式,在输入两个0的时候结束

2、g[N][N]存储图,st[N]代表判断当前某个点有没有被使用过

3、判断开始的条件,并且每一遍都要初始化st数组,因为换数据的时候每一个点都是没有被使用过的

4、使用cnt来存储总数,标记当前点,已经被使用过了

5、使用偏移量来让 当前点移动,而且点的移动一般都是从最外圈开始,慢慢到最内圈,类似于蛇形矩阵

6、出界和当前点被使用过了就重新开始,不然的话cnt++,继续深搜,然后回溯,返回cnt

理解的小伙伴麻烦点个赞吧文章来源地址https://www.toymoban.com/news/detail-516999.html

到了这里,关于c++红与黑(DFS之连通性模型)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++深度优先搜索DFS

    目录 介绍 实现过程 模板 例题详解 1.枚举排列 2.迷宫寻路 3.八皇后 剪枝与优化 作业 今天我们来学习一个极其重要的算法:深度优先搜索。 深度优先搜索,又叫DFS,是遍历图或者数的一种算法,本质就是递归。具体方法:先以一个节点为起点,向一个方向扩展,再以新的节

    2024年01月16日
    浏览(44)
  • C++ 更多的DFS深度优先搜索...

    目录 DFS模版 剪枝 DFS的两种状态 使用全局变量存储 使用函数参数存储传递 众所周知,DFS是一种省督有限搜索,可以想象成一棵树根节点K开始递归到最深层的节点,通常用来枚举符合题目的所有可能情况或者个数。 话说,这个代码和全排列有什么不同吗哈哈哈哈哈 剪枝时

    2024年02月13日
    浏览(68)
  • 深度优先搜索(DFS)和广度优先搜索(BFS)两种算法c++

    深度优先搜索(DFS)和广度优先搜索(BFS)是一种用于遍历或搜索树图的一种算法,在这个过程中保证图或数的每个结点被访问且仅被访问一次,再按照每个结点访问的顺序不同分为深搜和广搜。 本文只讨论这两种算法在搜索方面的应用! 深度优先搜索 ( Depth-First-Search,DFS )它 沿

    2024年02月13日
    浏览(51)
  • 【C++算法】dfs深度优先搜索(上) ——【全面深度剖析+经典例题展示】

    💃🏼 本人简介:男 👶🏼 年龄:18 📕 ps:七八天没更新了欸,这几天刚搞完元宇宙,上午一直练🚗,下午背四级单词和刷题来着,还在忙一些学弟学妹录制视频和准备开学一些事,一直没空出时间来,等 20号练完车,也马上开学了QAQ。不过今天倒是空出来一些时间,恰好这

    2024年02月02日
    浏览(45)
  • C++深度优先搜索(DFS)算法的应用:树中可以形成回文的路径数

    深度优先搜索(DFS) 状态压缩 给你一棵 树(即,一个连通、无向且无环的图),根 节点为 0 ,由编号从 0 到 n - 1 的 n 个节点组成。这棵树用一个长度为 n 、下标从 0 开始的数组 parent 表示,其中 parent[i] 为节点 i 的父节点,由于节点 0 为根节点,所以 parent[0] == -1 。 另给你一

    2024年02月04日
    浏览(42)
  • 【DFS专题】深度优先搜索 “暴搜”优质题单推荐 10道题(C++ | 洛谷 | acwing)

    【DFS专题】优质题单推荐 10道题(C++ | 洛谷 | acwing) 来自b站大佬的题单 题单链接 每个位置选什么数 与全排列的差别就是第二个for循环开始的位置,换句话说就是每个数该放什么位置。 参数 : 前u个数 选 or 不选 的 需要保存第x位置的状态的时候就需要用st数组来存状态 i

    2023年04月08日
    浏览(50)
  • DFS深度优先搜索

    DFS(Depth-First Search) 深度优先搜索,是一种常用的图遍历算法,用于在图或树数据结构中遍历所有节点。 深度优先搜索从一个起始节点开始,沿着一条路径尽可能远地访问节点,直到到达不能继续前进的节点,然后返回上一层继续探索其他路径。这个过程是递归的,通过不

    2024年02月04日
    浏览(37)
  • DFS—深度优先搜索

    递归函数代码形式 1 1 2 3 5 8 13 21 34 55 89 ... 已知前两项为1,之后每一项等于前两项之和。 现输入n,请输出兔子数列的第n项。 F ( n ) = { 1 ( n = 0 ) n ∗ F ( n − 1 ) ( n 0 ) F(n)=begin{cases}1(n=0)\\\\n*F(n-1)(n0)end{cases} F ( n ) = { 1 ( n = 0 ) n ∗ F ( n − 1 ) ( n 0 ) ​ 不难分析出

    2024年02月20日
    浏览(64)
  • 深度优先搜索(DFS)算法

    目录 算法思想 时间复杂度和空间复杂度 算法实现 算法优缺点 应用领域 深度优先搜索(DFS)算法的思想是从图的某个起始顶点开始,沿着一条路径尽可能深入地访问图中的所有顶点,直到不能继续为止,然后返回并探索其他路径。具体而言,DFS算法使用栈数据结构来实现,

    2024年02月05日
    浏览(47)
  • 深度优先遍历(DFS)

    图的深度优先遍历类似于树的先根遍历(递归)。 树的先根遍历: 图的深度优先遍历 使用的逻辑结构是栈。 如果是非连通图,依旧无法遍历完所有结点。 所以,需要在遍历完一轮结点后,扫描未被标记的结点。 visited数组防止重复访问。 代码实现: 1.空间复杂度 来自函数

    2024年02月10日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包