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

news2024/11/14 19:02:07

  前言:

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

董晓算法的个人空间-董晓算法个人主页-哔哩哔哩视频 (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;//如果遍历过 就continue
      vis[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.coloradmin.cn/o/1679695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html--互动星空

<!doctype html> <html> <head> <meta charset"utf-8"> <title>互动星空</title><style> html,body {margin:0;overflow:hidden;width:100%;height:100%;cursor:none;background:black;background:linear-gradient(to bot…

第十四届蓝桥杯大赛软件赛国赛C/C++ 大学 B 组 拼数字

//bfs只能过40%。 #include<bits/stdc.h> using namespace std; #define int long long int a,b,c,dp[2028]; struct s {int x,y,z;string m; }; map<vector<int>,int>k; signed main() {ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>a…

大模型时代下的先行者:景联文科技引领数据标注新时代

在大模型时代&#xff0c;数据标注不再是简单的分类标注&#xff0c;而是一项融合了技术革新、专业技能、法律合规和精细化管理的综合性任务&#xff0c;对推动AI技术的发展和落地应用具有重要意义。 景联文科技作为AI基础行业的数据供应商&#xff0c;可协助人工智能企业解决整…

使用 cloudflare 免费服务,搭建临时邮箱,无需暴露自己的真实邮箱地址,保护个人隐私

使用 cloudflare 免费服务&#xff0c;搭建临时邮箱 地址 在线演示 &#x1f310;Github地址 https://github.com/find-xposed-magisk/cloudflare_temp_email 功能/TODO Cloudflare D1 作为数据库 使用 Cloudflare Pages 部署前端 使用 Cloudflare Workers 部署后端 email 转…

【合成孔径雷达】合成孔径雷达的多视角理解和时/频成像算法的统一解释

文章目录 一、什么是雷达成像&#xff08;1&#xff09;主要的遥感探测手段&#xff1a;光学、红外和雷达&#xff08;2&#xff09;从数学的角度&#xff1a;雷达成像主要研究什么&#xff1f;数据采集&#xff1a; y T x n yTxn yTxn信息提取&#xff1a; y − > x ? y…

【Image captioning】基于检测模型网格特征提取——以Sydeny为例

【Image captioning】基于检测模型网格特征提取——以Sydeny为例 今天,我们将重点探讨如何利用Faster R-CNN检测模型来提取Sydeny数据集的网格特征。具体而言,这一过程涉及通过Faster R-CNN模型对图像进行分析,进而抽取出关键区域的特征信息,这些特征在网格结构中被系统地…

鸿蒙HarmonyOS开发:List组件结合Badge、swipeAction实现微信消息列表侧滑删除效果

文章目录 一、ListItem的swipeAction属性二、Badge组件三、Search组件四、示例代码五、效果 一、ListItem的swipeAction属性 名称参数类型描述swipeAction{start?: CustomBuilder,end?:CustomBuilder,edgeEffect?: SwipeEdgeEffect,}用于设置ListItem的划出组件。- start: …

[数据集][目标检测]纸箱子检测数据集VOC+YOLO格式8375张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;8375 标注数量(xml文件个数)&#xff1a;8375 标注数量(txt文件个数)&#xff1a;8375 标注…

Zynq UltraScale+ RFSoC 配置存储器器件

Zynq UltraScale RFSoC 配置存储器器件 下表所示闪存器件支持通过 Vivado 软件对 Zynq UltraScale RFSoC 器件执行擦除、空白检查、编程和验证等配置操 作。 本附录中的表格所列赛灵思系列非易失性存储器将不断保持更新 &#xff0c; 并支持通过 Vivado 软件对其中所列…

Spring编程使用DDD的小把戏

场景 现在流行充血领域层&#xff0c;在原本只存储对象的java类中&#xff0c;增加一些方法去替代原本写在service层的crud&#xff0c; 但是例如service这种一般都是托管给spring的&#xff0c;我们使用的ORM也都托管给spring&#xff0c;这样方便在service层调用mybatis的m…

PostgreSQL扩展之PGroonga:多语言全文搜索

简介 PGroonga 是一个 PostgreSQL 扩展&#xff0c;它增加了基于 Groonga 的全文搜索索引方法。虽然原生的 PostgreSQL 支持全文索引&#xff0c;但它仅限于基于字母和数字的语言。PGroonga 提供了更广泛的字符支持&#xff0c;使其成为 PostgreSQL 支持的语言的超集&#xff…

malloc_consolidate

此文章用于详细介绍malloc_consolidate。 众所周知&#xff0c;fastbin一般是不能合并&#xff0c;但在malloc_consolidate中是个例外。 1.触发机制 首先构造这样的堆块结构 一个0x40的堆块在fastbin中&#xff0c;一个0x110的堆块在unbin中 随后我们尝试分配一个0x300的堆…

NSSCTF | [SWPUCTF 2021 新生赛]easyupload2.0

先传一个普通的一句话木马试一试 GIF89a <?php eval($_POST[shell]);?> 可以看到回显&#xff0c;不允许上传php文件。 使用Burpsuite抓包只修改ContentType后发现也不能绕过&#xff0c;说明服务器使用了黑名单后缀限制&#xff0c;那么我们可以使用其他的后缀代替ph…

ubuntu CUDA 驱动更新,版本更新,多CUDA版本管理

1 新版本驱动下载 前面介绍过window CUDA驱动更新&#xff0c;但是对于ubuntu 的驱动更新&#xff0c;没有一键操作。 本人笔记本电脑n年前装的CUDA DRIVER仅支持到cuda10.2&#xff0c;实在无法满足这日新月异的科技更新。 左 旧的驱动版本 右 新下载的硬件支持的驱动版本&…

使用RN的kitten框架的日历组件的修改

官方网页地址 下面就是我参考官方封装的时间日期组件&#xff08;主要是功能和使用方法&#xff0c;页面粗略做了下&#xff0c;不好看勿怪&#xff09; import React, {useState} from react; import {StyleSheet, View, TouchableOpacity, SafeAreaView} from react-native; …

运用MongoDB Atlas释放开发者潜能同时把控成本

在当下的商业环境中&#xff0c;不可预测性已经成为常态&#xff0c;工程团队负责人必须在把控不可预测性和优化IT成本的双重挑战下谋求平衡。 咨询公司德勤2024 MarginPLUS调查收集了300多位企业负责人的见解&#xff0c;报告中重点介绍了面对动荡的全球经济环境&#xff0c;…

kubernetes多master集群架构

一、完成master02节点的初始化操作 master02环境准备&#xff0c;详细过程参考上一期博客环境准备 #添加主机映射 vim /etc/hosts 192.168.88.3 master01 192.168.88.8 master02 192.168.88.4 node01 192.168.88.5 node021、准备master02节点需要的文件 从 master01 节点上拷…

数学:矩阵范数的定义、常见的矩阵范数

1 算子范数【从属范数】 1.1 1-算子范数【列和范数】 &#xff1a;即对A的每列的绝对值求和再求其中的最大值 1.2 ∞-算子范数【行和范数】即对 A 的每行的绝对值求和再求其中的最大值 1.3 2-算子范数【谱范数】 学过奇异值分解就知道谱范数是最大奇异值/ 二次型的最大特…

大数据Spark教程从入门到精通第四篇:Spark快速上手

一&#xff1a;Spark快速上手 1&#xff1a;创建Maven项目 idea安装scala_idea scala插件-CSDN博客 代表了我们安装scala的maven环境已经准备好了&#xff0c;代码可以正常跑了

kafka用java收发消息

用java客户端代码来对kafka收发消息 具体代码如下 package com.cool.interesting.kafka;import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.apache.kafka.clients.consumer.ConsumerRecords; i…