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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Angular 基础] - Angular 渲染过程 组件的创建

[Angular 基础] - Angular 渲染过程 & 组件的创建 之前的笔记为了推进度写的太笼统了&#xff08;只有功能没有其他&#xff09;&#xff0c;当时学的时候知道是什么东西&#xff0c;但是学完后重新复习发现有些内容就记不清了&#xff0c;所以重新用自己的语言总结一下 …

OpenAI开放新功能,可通过@一键调用任意GPTs

人工智能技术的快速发展为我们的生活带来了许多便利和创新。作为人工智能领域的重要成果之一&#xff0c;OpenAI的GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型在自然语言处理方面取得了巨大的突破。 近日&#xff0c;OpenAI宣布推出了GPT Mentions功能…

蓝桥杯每日一题-----数位dp

前言 今天浅谈一下数位dp的板子&#xff0c;我最初接触到数位dp的时候&#xff0c;感觉数位dp老难了&#xff0c;一直不敢写&#xff0c;最近重新看了一些数位dp&#xff0c;发现没有想象中那么难&#xff0c;把板子搞会了&#xff0c;变通也会变的灵活的多&#xff01; 引入…

docker入门教程之将应用程序容器化

将应用程序容器化 在本指南的其余部分中&#xff0c;您将使用在 Node.js 上运行的简单待办事项列表管理器。如果您不熟悉 Node.js&#xff0c;请不要担心。本指南不需要任何 JavaScript 经验。 先决条件 您已安装最新版本的 Docker Desktop。您已经安装了 Git 客户端。您可以…

初探unity中的ECS

ECS是一种软件架构模式&#xff0c;就像MVC一样。ECS最早在游戏《守望先锋》中提及到的相关链接。ECS具体是指实体&#xff08;entity&#xff09;、 组件&#xff08;component&#xff09;和系统&#xff08;system&#xff09;&#xff1a; 实体&#xff1a;实体是一个ID&a…

2.04作业

1.请编程实现双向链表的头插&#xff0c;头删&#xff0c;尾插&#xff0c;尾删。 头插&#xff1a; 尾插&#xff1a; 头删&#xff1a; 尾删&#xff1a; 2.请编程实现双向链表按任意位置插入&#xff0c;删除&#xff0c;修改&#xff0c;查找。 插入&#xff1a; 删除&am…

DS:时间复杂度和空间复杂度

创作不易&#xff0c;感谢三连&#xff01; 一、算法 1.1 什么是算法 算法(Algorithm):就是定义良好的计算过程&#xff0c;他取一个或一组的值为输入&#xff0c;并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤&#xff0c;用来将输入数据转化成输出结果。…

PM圆桌派:同事不愿意告诉你的职场套路有哪些?

职场是社会的缩影&#xff0c;想要崭露头角&#xff0c;获得更多升职加薪的机会&#xff0c;就不要做着和多数人一样的事情&#xff0c;却期待着不一样的结果。 职场上有很多潜在的规则&#xff0c;要会做事&#xff0c;也要会说话&#xff0c;更要会做人。如果不懂规则&#…

设置 相关

记录使用过程中做的设置相关事宜。方便后续查询 vscode如何自动生成html格式&#xff1a; vscode快速生成html模板 --两种方法&#xff0c;亲测有用_vscode自动生成html模板-CSDN博客 使用第二个方式。存储html格式后缀。输入&#xff01;&#xff0c;vscode自动补全。 安装…

浪漫的通讯录(顺序表篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 我会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能…

【iOS ARKit】3D 人体姿态估计

与基于屏幕空间的 2D人体姿态估计不同&#xff0c;3D人体姿态估计是尝试还原人体在三维世界中的形状与姿态&#xff0c;包括深度信息。绝大多数的现有3D人体姿态估计方法依赖2D人体姿态估计&#xff0c;通过获取 2D人体姿态后再构建神经网络算法&#xff0c;实现从 2D 到 3D人体…

2024年:用OKR管理你的生活

在科技高速发展的时代&#xff0c;越来越多的企业和团队开始采用OKR&#xff08;Objectives and Key Results&#xff09;管理方法来设定目标并跟踪进度。你是否想过&#xff0c;将OKR理念引入个人生活&#xff0c;以更有效地实现人生目标&#xff1f;本文将探讨如何在2024年运…