AcWing算法学习笔记:搜索与图论1(DFS + BFS + 树与图的深度优先遍历 + 树与图的广度优先遍历 + 拓扑排序)

搜索与图论

  • 一、DFS
    • ① 排列数字
    • ② n-皇后问题(还没写)
  • 二、BFS
    • ① 走迷宫
    • ② 八数码(还没写)
  • 三、树与图的深度优先遍历(树的重心)
  • 四、树与图的广度优先遍历(图中点的层次)
  • 五、有向图的拓扑序列

比较空间特点数据结构
DFS0(h)第一次搜到的答案不具有最短性stack
BFS0(2^h)第一次搜索到的答案一定是最短路queue

一、DFS

① 排列数字

算法
两个重要概念:回溯和剪枝
想好搜索顺序,构建一颗搜索树
回溯时一定要注意恢复现场

代码

#include <iostream>
#include <string>
#include <algorithm>

using namespace std;

const int N = 10;

int n;
int path[N];
bool st[N];

void dfs(int u)
{
    //当填充位置为n时,说明已经有n个数了,将路径上的n个数输出
    if (u == n)
    {
        for (int i = 0; i < n; i ++) cout << path[i] << " ";
        cout << endl;
        return ;
    }
    
    //从1~n中顺次判断,如果该数没有被遍历过,则取这个数
    for (int i = 1; i <= n; i ++)
    {
        if (!st[i])
        {
            st[i] = true; //修改状态
            path[u] = i;
            dfs(u + 1); //填充下一位数字
            st[i] = false; //还原状态
        }
    }
}

int main()
{
    cin >> n;
    
    dfs(0); //从path的0号位置开始填充
    
    return 0;
}

② n-皇后问题(还没写)

算法

代码


二、BFS

① 走迷宫

算法
在这里插入图片描述

代码

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

using namespace std;
const int N = 110;

typedef pair <int, int> PII;

int n, m;
int g[N][N];
int st[N][N]; //记录当前节点最少需要几步走到,并且防止每个节点被遍历两次

void bfs()
{
    queue <PII> q;
    q.push({0, 0});
    st[0][0] = 0;

    while (!q.empty()) //可以遍历到所有的0,仅且只有一遍
    {
        auto cur = q.front();
        q.pop();
        
        int dx[4] = {-1, 1, 0, 0};
        int dy[4] = {0, 0, -1, 1};
        for (int i = 0; i < 4; i ++)
        {
            int a = cur.first + dx[i], b = cur.second + dy[i];
            if (a >= 0 && a < n && b >= 0 && b < m && g[a][b] == 0 && st[a][b] == -1)
            {
                q.push({a, b});
                st[a][b] = st[cur.first][cur.second] + 1; //该节点的出边节点所需步数加一
            }
        }
    }
    cout << st[n - 1][m - 1]; //出口处那个点记录的步数一定是最少的
}

int main()
{
    cin >> n >> m;
    
    for (int i = 0; i < n; i ++)
        for (int j = 0; j < m; j ++)
            cin >> g[i][j];
    
    memset(st, -1, sizeof(st));
    
    bfs();
    
    return 0;
}

② 八数码(还没写)

算法

代码


在这里插入图片描述

三、树与图的深度优先遍历(树的重心)

代码

const int N = 100010, M = N * 2; //N条边,开2 * N 个点
int h[N], e[M], ne[M], idx; // h存储每个节点的存放位置,e存放每个节点的值,ne存放下一个节点的位置,idx指向当前使用的数组下标
bool st[M]; //记录每个节点是否被遍历过

//初始化
memset(h, -1, sizeof(h));

//将y节点接入以x为头的单链表中
//读入边使用add函数构建图,例如无向图x - y :add(x, y), add(y, x),需要双向连接
void add(int x, int y)
{
    e[idx] = y;
    ne[idx] = h[x];
    h[x] = idx ++;
}

//遍历以u为头的单链表
for (int i = h[u]; i != -1; i = ne[i]){}

//树的深搜,可以返回以u为根节点的子节点数目
int dfs(int u)
{
    st[u] = true;
    
    int sum = 1;
    for (int i = h[u]; i != -1; i = ne[i])
    {
        int cur = e[i]; //当前访问节点的内容
        if (!st[cur])
        {
            int s = dfs(cur);
            sum += s;
        }
    }
    return sum;
}

//树的宽搜就是套用普通宽搜模板即可

四、树与图的广度优先遍历(图中点的层次)

算法

代码


五、有向图的拓扑序列

算法
使用邻接表存储有向图,并记录每个点的入度
使用bfs得到拓扑序列,并且可以判断该图中是否有环
每次将入度为0的点放入队列,该点弹出时,将其相连的点入度-1,并将入度为0的点入队
若存在环,整个过程中所有入度为0的点的个数小于总点数
代码

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

using namespace std;

const int N = 100010;

int n, m, R[N];
int h[N], e[N], ne[N], idx;

void add(int x, int y)
{
    e[idx] = y;
    ne[idx] = h[x];
    h[x] = idx ++;
}

void bfs()
{
    queue <int> q, res;
    for (int i = 1; i <= n; i ++)
    {
        if (!R[i])
        {
            q.push(i);
            res.push(i);
        }
    }
    
    while (!q.empty())
    {
        auto t = q.front();
        q.pop();
        
        for (int i = h[t]; i != -1; i = ne[i])
        {
            int j = e[i];
            R[j] --;
            if (R[j] == 0)
            {
                q.push(j);
                res.push(j);
            }
        }
    }
    if (res.size() < n) cout << -1;
    else
    {
        while (!res.empty())
        {
            auto x = res.front();
            res.pop();
            cout << x << " ";
        }
    }
}

int main()
{
    memset(h, -1, sizeof(h));
    cin >> n >> m;
    
    bool flag = false;
    for (int i = 0; i < m; i ++)
    {
        int x, y;
        cin >> x >> y;
        if (x == y)
        {
            flag = true;
        }
        R[y] ++;
        add(x, y);
    }
    if (flag) cout << -1;
    else bfs();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/370200.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VUE3+TS使用OpenSeadragon学习之旅,实现多图片切换效果

1.官方网站&#xff1a;OpenSeadragon 2.使用npm下载插件&#xff1a;npm install openseadragon 3.在 index.html文件引入资源 <link rel"stylesheet" href"node_modules/openseadragon/build/openseadragon/openseadragon.css" /><script src…

基于YOLOv8的足球赛环境下足球目标检测系统(Python源码+Pyqt6界面+数据集)

博主简介 AI小怪兽&#xff0c;YOLO骨灰级玩家&#xff0c;1&#xff09;YOLOv5、v7、v8优化创新&#xff0c;轻松涨点和模型轻量化&#xff1b;2&#xff09;目标检测、语义分割、OCR、分类等技术孵化&#xff0c;赋能智能制造&#xff0c;工业项目落地经验丰富&#xff1b; …

【Nginx】Nginx

❤️ Author&#xff1a; 老九 ☕️ 个人博客&#xff1a;老九的CSDN博客 &#x1f64f; 个人名言&#xff1a;不可控之事 乐观面对 &#x1f60d; 系列专栏&#xff1a; 文章目录 公司产品出现瓶颈Nginx作用Nginx安装window下安装linux下安装 Nginx常用命令 公司产品出现瓶颈 …

企业FTP传输慢?最新FTP加速和FTP替代方案!

在当今这个信息泛滥的时代&#xff0c;企业对于数据传输的速率和效率有着空前的需求。文件传输作为日常工作中的关键环节&#xff0c;其效率直接关系到项目的进展和企业的市场竞争力。 传统的FTP&#xff08;文件传输协议&#xff09;在处理大规模数据传输时&#xff0c;常常显…

Java SPI 代码示例

Java Service Provider Interface 是JDK自带的服务提供者接口又叫服务发现机制更是一种面向接口的设计思想。即JDK本身提供接口类&#xff0c; 第三方实现其接口&#xff0c;并作为jar包或其他方式注入到其中&#xff0c; 在运行时会被JDK ServiceLoader 发现并加载&#xff0c…

深度神经网络如何启用卤化物后端以提高效率

介绍 本教程指导如何使用 Halide 语言后端在 OpenCV 深度学习模块中运行模型。Halide 是一个开源项目&#xff0c;它让我们以可读性强的格式编写图像处理算法&#xff0c;根据特定设备安排计算并以相当高的效率对其进行评估。 卤化物项目的官方网站&#xff1a;Halide。 最新…

(4)【Python数据分析进阶】Machine-Learning模型与算法应用-回归、分类模型汇总

线性回归、逻辑回归算法应用请参考: https://codeknight.blog.csdn.net/article/details/135693621https://codeknight.blog.csdn.net/article/details/135693621本篇主要介绍决策树、随机森林、KNN、SVM、Bayes等有监督算法以及无监督的聚类算法和应用PCA对数据进行降维的算法…

修改UnityEngine dll

修改UnityEngine dll 由于有些版本的dll与热重载并不兼容&#xff0c;需要小幅修改代码。 使用dnspy工具 我们使用 dnspy 来修改 dll文件。而dnspy只能在Win下运行&#xff0c;故哪怕是mac版本dll&#xff0c; 你也得先将相应dll复制到Win下后再修改。下载 dnspy&#xff0c…

C#之linq和lamda表达式GroupBy分组拼接字符串

文章目录 C#之linq和lamda表达式GroupBy分组拼接字符串业务需求核心代码调试 C#之linq和lamda表达式GroupBy分组拼接字符串 业务需求 点击提示信息&#xff0c;如&#xff1a;“售后单【SH001】序列号【001&#xff0c;002&#xff0c;006】&#xff1b;售后单【SH002】序列号…

【Spring】代理模式

文章目录 代理模式对代理模式的理解静态代理动态代理JDK动态代理原理源码优化 CGLIB动态代理使用原理 JDK与CGLIB的对比 面试题JDK动态代理和CGLIB有什么区别&#xff1f;既然有没有接口都可以用CGLIB&#xff0c;为什么Spring还要使用JDK动态代理&#xff1f; 代理模式 对代理…

3 编辑器(Vim)

1.完成 vimtutor。备注&#xff1a;它在一个 80x24&#xff08;80 列&#xff0c;24 行&#xff09; 终端窗口看起来效果最好。 2.下载我们提供的 vimrc&#xff0c;然后把它保存到 ~/.vimrc。 通读这个注释详细的文件 &#xff08;用 Vim!&#xff09;&#xff0c; 然后观察 …

如何在Shopee平台上进行测款选品

在如今竞争激烈的电商市场&#xff0c;选择合适的产品成为卖家们提高销售业绩的重要一环。在Shopee平台上进行测款选品&#xff0c;可以帮助卖家找到符合市场需求的产品&#xff0c;提高销售业绩。本文将介绍一些策略和步骤&#xff0c;帮助卖家在Shopee平台上进行测款选品。 …

javaEE - 20( 18000字 Tomcat 和 HTTP 协议入门 -1)

一&#xff1a; HTTP 协议 1.1. HTTP 是什么 HTTP (全称为 “超文本传输协议”) 是一种应用非常广泛的 应用层协议. HTTP 诞生与1991年. 目前已经发展为最主流使用的一种应用层协议. 最新的 HTTP 3 版本也正在完善中, 目前 Google / Facebook 等公司的产品已经支持了. HTT…

【Python基础021】Python中的何如实现文件的读写

Python中文件的读写在程序运行过程中是一个非常重要的操作&#xff0c;我们通常会将一些大量的临时数据暂时存放到一个临时文件&#xff0c;这就需要用到文件的读取与写入功能。话不多说&#xff0c;我们直接上才艺。 1、文本文件和二进制文件 讲文件读写前&#xff0c;先说说…

sqli.labs靶场(29到40关)

29、第二十九关 id1 id1 尝试发现是单引号闭合&#xff0c; -1 union select 1,2,3-- -1 union select 1,2,database()-- -1 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schemasecurity)-- -1 union select 1,2,(select…

C#(C Sharp)学习笔记_前言及Visual Studio Code配置C#运行环境【一】

前言 这可以说是我第一次正式的踏入C#的学习道路&#xff0c;我真没想过我两年前是怎么跳过C#去学Unity3D游戏开发的&#xff08;当然了&#xff0c;游戏开发肯定是没有成功的&#xff0c;都是照搬代码&#xff09;。而现在&#xff0c;我真正地学习一下C#&#xff0c;就和去年…

STM32--揭秘中断(简易土货版)

抢占优先级响应优先级 视频学习--中断​​​​​​​

队列---数据结构

定义 队列&#xff08;Queue&#xff09;简称队&#xff0c;也是一种操作受限的线性表&#xff0c;只允许在表的一端进行插入&#xff0c;而在表的另一端进行删除。向队列中插入元素称为入队或进队&#xff1b;删除元素称为出队或离队。 队头&#xff08;Front&#xff09;&a…

单片机的50个电路

单片机 电源 声音模块 收音机 485 蓝牙 光耦 can 光敏电阻 单片机 矩阵 单片机电路 时钟 ADC 接口电路 红外发射 显示模块 红外接收 蜂鸣器驱动 流水灯 usb供电 烧录电路 数码管 EEPROM LCD1602电路 数码管 max485 红外开关 译码器 移位寄存器 步进电机控制 复位电路 下载电路 …

Python之列表的增删改查

列表的查 a ["klvchen", "tom", "jack", "james", "lily", "lucy"] print(a[1:4]) 结果&#xff1a; [tom, jack, james] 注意&#xff1a; 列表的切片的下标以 0 为开始。即&#xff1a; 下标0 --> klvchen…