[董晓算法]搜索相关题目及模板

  前言:

本系列是学习了董晓老师所讲的知识点做的笔记

董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (bilibili.com)

 动态规划系列(还没学完)

【董晓算法】动态规划之线性DP问题-CSDN博客

【董晓算法】动态规划之背包DP问题(2024.5.11)-CSDN博客

【董晓算法】动态规划之背包DP与树形DP-CSDN博客

字符串系列()

【董晓算法】竞赛常用知识之字符串1-CSDN博客

【董晓算法】竞赛常用知识之字符串2-CSDN博客

数据结构系列(未学完)

【董晓算法】竞赛常用知识点之数据结构1-CSDN博客

STL容器

图的存储

领接矩阵

应用:适用于点数不多的稠密图

int w[N][N];//边权 
int vis[N];
void dfs(int u){vis[u]=true;for(int v=1;v<=n;v++)if(w[u][v]){printf("%d,%d,%d\n",u,v,w[u][v]);if(vis[v]) continue;dfs(v);}
}
int main(){cin>>n>>m;for(int i=1;i<=m;i++){cin>>a>>b>>c;w[a][b]=c; }dfs(1);return 0;
}

边集数组

应用:在 Kruskal算法中,需要将边按边权排序,直接存边

struct edge{int u,v,w;
}e[M];//边集 
int vis[N];
void dfs(int u){vis[u]=true;//标记为使用过for(int i=1;i<=m;i++)if(e[i].u==u){int v=e[i].v,w=e[i].w;printf("%d,%d,%d\n",u,v,w);if(vis[v]) continue;dfs(e[i].v);}
}        
int main(){cin>>n>>m;for(int i=1;i<=m;i++){cin>>a>>b>>c;e[i]={a,b,c};//边的存储方式// e[i]={b,a,c};}dfs(1);return 0;
}

if(e[i].u==u)

作用:检查这条边的起始顶点 e[i].u 是否与当前正在考虑的顶点 u 相同

邻接表

出边数组e[u][i]存储u点的所有出边的{终点v,边权w}

struct edge{int v,w;};
vector<edge> e[N];//边集 
void dfs(int u,int fa){for(auto ed : e[u]){int v=ed.v, w=ed.w;if(v==fa) continue;printf("%d,%d,%d\n",u,v,w);dfs(v, u);} 
}
int main(){cin>>n>>m;for(int i=1;i<=m;i++){ cin>>a>>b>>c,e[a].push_back({b,c});e[b].push_back({a,c});}dfs(1, 0);return 0;
}

链式邻接表

边集数组 e[j] 存储第j条边的 {起点u,终点v,边权w]

表头数组 h[u][i] 存储u点的所有出边的编号

应用:各种图,能处理反向边

struct edge{int u,v,w;};
vector<edge> e;//边集
vector<int> h[N];//点的所有出边
void add(int a,int b,int c){e.push_back({a,b,c});h[a].push_back(e.size()-1);
}
void dfs(int u,int fa){for(int i=0;i<h[u].size();i++){int j=h[u][i];int v=e[j].v,w=e[j].w;if(v==fa) continue;printf("%d,%d,%d\n",u,v,w);dfs(v,u);}
}
int main(){cin>>n>>m;for(int i=1;i<=m;i++){cin>>a>>b>>c,add(a,b,c);add(b,a,c);}  dfs(1, 0);return 0;
}

 链式前向星

一个表头数组悬挂多个链表

边集数组 e[i]存储第i条出边的{终点v,边权w,下一条诀ne}

表头数组加存储u点的第一条出边的编号

边的编号 idx 可取 0,1,2,3 ..

​ 

struct edge{int v,w,ne;};
edge e[M];//边集
int idx,h[N];//点的第一条出边 
void add(int a,int b,int c){e[idx]={b,c,h[a]};h[a]=idx++;
}
void dfs(int u,int fa){for(int i=h[u];~i;i=e[i].ne){int v=e[i].v, w=e[i].w;if(v==fa) continue;printf("%d,%d,%d\n",u,v,w);dfs(v,u);}
}
int main(){cin>>n>>m;memset(h,-1,sizeof h);for(int i=1;i<=m;i++){cin>>a>>b>>c,add(a,b,c);add(b,a,c);}  dfs(1, 0);return 0;
}

DFS

int n, m, a, b, c;
vector<int> e[N];
void dfs(int u, int fa){for(auto v : e[u]){if(v==fa) continue;dfs(v, u);} 
}
int main(){cin>>n>>m;for(int i=1;i<=m;i++)cin>>a>>b, e[a].push_back(b),e[b].push_back(a);dfs(1, 0);return 0;
}

迷宫方案数

P1605 迷宫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

​ 

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;const int N = 10;
int m,n,t,sx,sy,fx,fy,a,b,ans;
int g[N][N];
int dx[4]={-1,0,1, 0},dy[4]={ 0,1,0,-1};void dfs(int x, int y){if(x==fx&&y==fy){ans++;return;}for(int i=0; i<4; i++){int a=x+dx[i], b=y+dy[i];//四个方位寻找if(a<1||a>n||b<1||b>m||g[a][b])continue;//退出条件g[a][b]=1; //锁定现场dfs(a, b);//递归g[a][b]=0; //恢复现场}    
}
int main(){cin>>n>>m>>t>>sx>>sy>>fx>>fy;for(int i=0;i<t;i++)cin>>a>>b, g[a][b]=1;g[sx][sy]=1;dfs(sx,sy);cout<<ans;return 0;
}

跳马方案数

P1644 跳马问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

学会设置偏移量(探照灯)
学会判越界,判重,回溯

int dx[4]={2,1,-1,-2};
int dy[4]={1,2, 2, 1};
void dfs(int x, int y){if(x==n&&y==m){ans++;return;}for(int i=0; i<4; i++){int a=x+dx[i], b=y+dy[i];if(a<0||a>n||b>m) continue;// printf("(%d,%d)\n",a,b);dfs(a,b);}    
}
void dfs(int x, int y){if(x==n&&y==m){ans++;return;}for(int i=0; i<4; i++){int a=x+dx[i], b=y+dy[i];//四个方位寻找if(a<0||a>n||b>m)continue;//退出条件dfs(a, b);//递归}    
}

八皇后

P1219 [USACO1.5] 八皇后 Checker Challenge - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

学会按行搜索状态空间
学会标记对角线的技巧:p[i+j],q[i-j+n]对角线与行列的映射关系

对角线技巧也可以通过列方程获得

int n, ans;
int pos[N],c[N],p[N],q[N];
void print(){if(ans<=3){//题目中只需要三个for(int i=1;i<=n;i++)printf("%d ",pos[i]);puts("");}
}
void dfs(int i){if(i>n){//终止条件ans++; print(); return;}for(int j=1; j<=n; j++){if(c[j]||p[i+j]||q[i-j+n])continue;//退出条件pos[i]=j; //记录第i行放在了第j列c[j]=p[i+j]=q[i-j+n]=1; //宣布占领dfs(i+1);c[j]=p[i+j]=q[i-j+n]=0; //恢复现场}
}
int main(){cin >> n;dfs(1);cout << ans;return 0;
}

水坑计数

判重技巧:节点变性

P1596 [USACO10OCT] Lake Counting S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

char g[N][N];
int dx[8]={-1,-1,-1,0,1,1,1,0};
int dy[8]={-1,0,1,1,1,0,-1,-1};void dfs(int x,int y){g[x][y]='.';for(int i=0;i<8;i++){int a=x+dx[i],b=y+dy[i];if(a<0||a>=n||b<0||b>=m)continue;if(g[a][b]=='.')continue;dfs(a,b);}
}

BFS

vector<int> e[N];
int vis[N];
queue<int> q;void bfs( ){vis[1]=1; q.push(1); //访问该点while(q.size()){//循环条件int x=q.front(); q.pop();//取对头元素for(auto y : e[x]){//遍历元素if(vis[y]) continue;//如果遍历过 就continuevis[y]=1; q.push(y);}}
}

迷宫最短路 

int n,g[N][N];
struct Node{int x,y;}; 
npde pre[N][N];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};void bfs (int x,int y){queue<Node> q;q.push({x,y});g[x][y] = 1;while(q.size()){auto u=q.front(); q.pop();for(int i = 0; i < 4; i ++){int a = u.x+dx[i],b = u.y+dy[i];if(a<0||a>=n||b<0||b>=n)continue;if(g[a][b])continue;g[a][b] = 1;//打标记pre[a][b] = u;//记录路径q.push({a,b});}        }
}
void print(int x,int y){if(x==0%%y==0) return;node p=pre[x][y];print(p.x,p.y);//递归printf("%d %d\n",x,y);
}
int main(){cin >> n;for(int i = 0; i < n; i ++)for(int j = 0; j < n; j ++)scanf("%d",&g[i][j]);bfs(0,0);puts("0 0");print(n-1,n-1);return 0;
}

矩阵距离-多源BFS问题

开始就把所有源头压入队列,其余同单源BFS问题一样

char g[N][N];
struct Node{int x,y;};
int dis[N][N];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};void bfs(){memset(dis,-1,sizeof dis);queue<Node> q;for(int i=0; i<n; i++)for(int j=0; j<m; j++)if(g[i][j] == '1')dis[i][j]=0, q.push({i,j});while(q.size()){auto t=q.front(); q.pop();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>=m)continue;if(dis[a][b]!=-1) continue;dis[a][b]=dis[t.x][t.y]+1;q.push({a,b});}}
}

DFS和BFS对比

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

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

相关文章

x264 帧类型代价计算原理:slicetype_mb_cost 函数分析

slicetype_mb_cost 函数 函数功能 计算每个宏块 MB 的代价 cost。函数参数分析 x264_t *h:全局编码结构体x264_mb_analysis_t *a:宏块分析结构体x264_frame_t **frames:系列帧数据结构体int p0:帧序号之一,一般指向靠前帧int p1:帧序号之一,一般指向靠后帧int b:帧标志…

安卓Fragment基础

目录 前言一、基础使用二、动态添加Fragment三、Fragment的生命周期四、Fragment之间进行通信五、Fragment兼容手机和平板示例 前言 Fragment基础使用笔记 一、基础使用 Activity布局和文件 <LinearLayout xmlns:android"http://schemas.android.com/apk/res/andro…

985大学电子信息专硕,考C语言+数据结构!中央民族大学25计算机考研考情分析!

中央民族大学&#xff08;Minzu University of China&#xff09;坐落于北京市学府林立的海淀区&#xff0c;南邻国家图书馆&#xff0c;北依中关村科技园&#xff0c;校园环境典雅&#xff0c;古朴幽美&#xff0c;人文氛围浓郁&#xff0c;具有鲜明的民族特色。由北京市、国家…

linux使用教程(命令介绍、命令格式和命令的使用技巧)

一、命令的格式 1.1 打开终端的方式 ubuntu中的命令基本都是在终端执行的 打开终端的方式&#xff1a; 第一种方法&#xff1a;在ubuntu桌面中鼠标右键选择“打开终端” 第二种方法&#xff1a;使用快捷键ctrl alt t 1.2 终端提示符 stuqfedu:~$ 对于这个提示符 stu&…

五丰黎红销量增长的秘诀:一物一码数字化营销开创调味品行业新格局!

根据当今经济环境和未来的发展趋势&#xff0c;传统经济向数字化经济转型的发展方向可以说是大势所趋&#xff0c;如何把握先机&#xff0c;率先迈出数字化转型第一步&#xff0c;可以说是无数传统企业都需要思考的问题。 作为中国调味品行业的佼佼者&#xff0c;五丰黎红踩着时…

算法学习笔记(5.0)-基于比较的高效排序算法-归并排序

##时间复杂度O(nlogn) 目录 ##时间复杂度O(nlogn) ##递归实现归并排序 ##原理 ##图例 ##代码实现 ##非递归实现归并排序 ##释 #代码实现 ##递归实现归并排序 ##原理 是一种基于分治策略的基础排序算法。 1.划分阶段&#xff1a;通过不断递归地将数组从中点处分开&…

Darknet+ros+realsenseD435i+yolo(ubuntu20.04)

一、下载Darknet_ros mkidr -p yolo_ws/src cd yolo_ws/src git clone --recursive https://github.com/leggedrobotics/darknet_ros.git #因为这样克隆的darknet文件夹是空的&#xff0c;将darknet_ros中的darknet的文件替换成如下 cd darknet_ros git clone https://github.…

PDK安装及简介

目录 PDK简介 pdk安装 Standard Cell Library简介 IO Library简介 PDK简介 PDK&#xff1a;全称Process Design Kit&#xff0c;是工艺设计工具包的缩写&#xff0c;是制造和设计之间的沟通桥梁&#xff0c;是模拟电路设计的起始点。 具体来说&#xff0c;PDK是代工厂(FAB…

聊聊数据库索引

一、索引类型介绍 索引是对数据库表中一列或多列的值进行排序的一种结构。 一个非常恰当的比喻就是书的目录页与书的正文内容之间的关系&#xff0c;为了方便查找书中的内容&#xff0c;通过对内容建立索引是对数据库表中一列或多列的值进行排序的一种结构。 索引形成目录。索…

【liunx】yumvim

目录 Linux 软件包管理器 yum 关于 rzsz 注意事项 查看软件包 Linux开发工具 Linux编辑器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 vim末行模式命令集 简单vim配置 配置文件的位置 sudo提权 Linux 软件包管理器 yum 1.yum是什么&#xff1…

【开发】模型部署笔记

目录 模型量化 模型量化 1、模型量化优点 低精度模型表示模型权重数值格式为FP16&#xff08;半精度浮点&#xff09;或者INT8&#xff08;8位定点整数&#xff09;&#xff0c;但是目前低精度往往就指代INT8。常规精度模型则一般表示模型权重数值格式为FP32&#xff08;32位…

CSS学习笔记之中级教程(二)

-.CSS学习笔记之中级教程&#xff08;一&#xff09; 6、CSS 布局 - display: inline-block 与 display: inline 相比&#xff0c;主要区别在于 display: inline-block 允许在元素上设置宽度和高度。 同样&#xff0c;如果设置了 display: inline-block&#xff0c;将保留上下…