day50|DFS,BFS

news2024/12/19 8:02:13

深度优先遍历(DFS)

不撞南墙不回头算法

撞了之后就回退一步找别的路(回溯算法)

直到访问所有的顶点

注意:深度优先遍历的序列不是唯一的

若无向图非连通:

需要执行多次深度优先遍历

重要结论:对于非连通无向图,执行几次深度优先搜索,图中就有几个连通分量

回忆一下回溯算法模板

void backtracking(参数)
{
    if(终止条件)
    {
        存放结果;
        return;
    }
    for(选择:本层集合中的元素)
    {
        处理结点;
        backtracking(路径,选择列表);
        回溯,撤销结果
}
}

dfs代码框架

void dfs(参数)
{
    if(终止条件)
    {
        存放结果;
        return;
    }
    for(选择:本结点所连接的其他结点)
    {
        处理结点;
        dfs(图,处理的结点);
        回溯,撤销结果   
}
}

深搜三部曲

1.确认递归函数,参数

void dfs(参数);
举例:
vector<vector<int>>result;
vector<int>path;
void dfs(图,目前搜索的结点)

2.确认终止条件

if(终止条件)
{
    存放结果;
    return;
}

3.处理当前搜索结点出发的路径

for(选择:本结点所连接的结点)
{
    处理结点;
    dfs(图,选择的结点);
    回溯,撤销处理的结果
}

1.所有可达路径

【题目描述】

给定一个有 n 个节点的有向无环图,节点编号从 1 到 n。请编写一个函数,找出并返回所有从节点 1 到节点 n 的路径。每条路径应以节点编号的列表形式表示。

【输入描述】

第一行包含两个整数 N,M,表示图中拥有 N 个节点,M 条边

后续 M 行,每行包含两个整数 s 和 t,表示图中的 s 节点与 t 节点中有一条路径

【输出描述】

输出所有的可达路径,路径中所有节点的后面跟一个空格,每条路径独占一行,存在多条路径,路径输出的顺序可任意。

如果不存在任何一条路径,则输出 -1。

注意输出的序列中,最后一个节点后面没有空格! 例如正确的答案是 1 3 5,而不是 1 3 5, 5后面没有空格!

数据范围:

  • 图中不存在自环

  • 图中不存在平行边

  • 1 <= N <= 100

  • 1 <= M <= 500

重点练习邻接矩阵和邻接表的使用方法以及深搜模板

**邻接矩阵**:
 //结点编号从1开始,为了结点标号与下标对齐,申请(n+1)*(n+1)的二维数组
    vector<vector<int>>graph(n+1,vector<int>(n+1,0));
//输入m个边
while(m--)
{
    cin>>s>>t;
    //邻接矩阵,1表示s指向t
    graph[s][t]=1;
}
​
**邻接表**
 //邻接表=数组+链表,根据边的数量来表示图,有多少边就申请对应多大的链表
    //结点编号从1到n,申请n+1大小的数组
  vector<list<int>>graph(n+1);//list为c++中的链表
//输入m个边
while(m--)
{
    cin>>s>>t;
    //使用邻接表,表示s->t是相连的
    graph[s].push_back(t);
}

代码:

#include <iostream>
#include <list>
#include <vector>
​
using namespace std;
​
vector<vector<int>>result;//存储所有的路径
vector<int>path;//存储单条路径
void dfs(const vector<vector<int>>&graph,int cur,int end)
{
    //确定终止条件
    if(cur==end)//抵达终点
    {
        result.push_back(path);
        return;
    }
    //循环
    for(int i=1;i<=end;i++)//遍历当前结点cur链接的所有结点
    {
        if(graph[cur][i]==1)//连上了
        {
            path.push_back(i);//加入路径
            dfs(graph,i,end);//进入下一层递归
            path.pop_back();//撤销操作
        }
    }
}
int main()
{
    int N,M;
    int s,t;
    cin>>N>>M;
    
    vector<vector<int>>graph(N+1,vector<int>(N+1,0));//邻接矩阵存图
    while(M--)
    {
        cin>>s>>t;
        graph[s][t]=1;
    }
    
    path.push_back(1);//无论什么路径都已经是从0结点出发
    dfs(graph,1,N);
    //输出结果
    if(result.size()==0)cout<<-1<<endl;
    for(const vector<int>&pa:result)
    {//输出二维数组结果中的一维数组路径
        for(int i=0;i<pa.size()-1;i++)
        {
            cout<<pa[i]<<" ";
        }
        cout<<pa[pa.size()-1]<<endl;//防止最后一个元素后面出现空格,导致不通过
    } 
}
邻接表版本
#include <iostream>
#include <vector>
#include <list>
​
using namespace std;
​
vector<vector<int>>result;
vector<int>path;//节点1到终点的路径
​
void dfs(const vector<list<int>>&graph,int cur,int end)
{
    if(cur==end)
    {
        result.push_back(path);
        return;
    }
    for(int i:graph[cur])//找到cur指向的节点
    {
        path.push_back(i);
        dfs(graph,i,end);
        path.pop_back();
    }
}
​
int main()
{
    int n,m,s,t;
    cin>>n>>m;
    
    vector<list<int>>graph(n+1);//邻接表
    while(m--)
    {
        cin>>s>>t;
        graph[s].push_back(t);
    }
    path.push_back(1);//从1开始
    dfs(graph,1,n);
    if(result.size()==0)cout<<-1<<endl;
    for(const vector<int>&pa:result)
    {
        for(int i=0;i<pa.size()-1;i++)
        {
            cout<<pa[i]<<" ";
        }
        cout<<pa[pa.size()-1]<<endl;
    }
    return 0;
}

广度优先遍历(BFS)

概括:层层扩散

适用于解决两个点之间的最短路径问题

广度优先遍历的次序也不是唯一的

如果一次遍历无法访问到所有的顶点就要多次遍历

int dir[4][2]={0,1,1,0,-1,0,0,-1};//表示四个方向
//grid是地图,也就是一个二维数组
//visited标记已经访问过的节点,不要重复访问
//x,y表示开始搜索节点的下标
void bfs(vector<vector<char>>&grid,vector<vector<bool>>&visited,int x,int y)
{
    queue<pair<int,int>>que;//定义队列
    que.push({x,y});//起始节点加入队列
    visited[x][y]=true;//只要加入队列就立即标记为已经访问过的节点
    while(!que.empty())
    {
        pair<int,int>cur = que.front();
        que.pop();//从队列取元素
        int curx = cur.first;
        int cury = cur.second;//当前节点坐标
        for(int i=0;i<4;i++)
        {
            int nextx=curx+dir[i][0];// 开始想当前节点的四个方向左右上下去遍历
            int nexty = cury + dir[i][1];
            if(nextx<0 || nextx>=grid.size()||nexty < 0 || nexty >= grid[0].size())continue;
            if(!visited[nextx][nexty])
            {//如果节点没被访问过
                que.push({nextx,nexty});//添加该节点为下一轮要遍历的节点
                visited[nextx][nexty]=true;//立即标记为已访问               
      }          
    }               
  }   
}

期末好忙,完全没空补dp

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

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

相关文章

Linux系统安装部署Tomcat

1、进入Tomcat官网&#xff0c;官网地址&#xff1a;https://tomcat.apache.org/ 2、点击左侧Download下的Archives按钮 3、选择需要下载的版本 下载地址&#xff1a;https://archive.apache.org/dist/tomcat/ 4、点击自己需要下载的版本&#xff0c;我这里下载的是9.0.6 5、…

java全栈day17--Web后端实战(java操作数据库)

前言&#xff1a;本章应该是针对数据库基础讲解&#xff0c;数据的增删改查但是本人忘记对知识进行归纳总结就直接跳过&#xff0c;基本的内容都很简单&#xff0c;都是套式子使用。现在开始学习本章&#xff0c;很重要需要好好掌握。 一、使用的工具 二、JDBC 2.1概述 JDBC …

分立器件---运算放大器关键参数

运算放大器 关键参数 1、供电电压:有单电源电压、双电源电压,双电源电压尽量两个电源都接。如图LM358B,供电电压可以是20V或者是40V和GND。 2、输入偏置电流IB:当运放输出直流电压为零时,运放两个输入端流进或者流出直流电流的平均值。同向输入端电流IB+与反向输入端电流…

CS61a.1 textbook1.2 编程要素

1.structure and interpretation of computer programs Python 内置了对各种常见编程活动的支持&#xff0c; 例如&#xff0c;操作文本、显示图形以及通过 互联网。Python 代码行 >>> from urllib.request import urlopen是一个 import 语句&#xff0c;用于加载用…

第100+33步 ChatGPT学习:时间序列EMD-ARIMA-LSTM模型

基于Python 3.9版本演示 一、写在前面 上一节&#xff0c;我们学了经验模态分解&#xff08;Empirical Mode Decomposition&#xff0c;EMD&#xff09;。 如同结尾所说&#xff0c;“那么&#xff0c;做这些分解有什么作用呢&#xff1f;有大佬基于这些分解出来的序列分别作…

vulnhub靶场【DriftingBlues】之7

前言 靶机&#xff1a;DriftingBlues-6&#xff0c;IP地址192.168.1.65 攻击&#xff1a;kali&#xff0c;IP地址192.168.1.16 都采用虚拟机&#xff0c;网卡为桥接模式 主机发现 使用arp-scan -l或netdiscover -r 192.168.1.1/24 信息收集 使用nmap扫描端口 SSH服务&…

[Unity]在unity 中输出调试安卓真机日志

添加包 Android Logcat com.unity.mobile.android-logcat 简单介绍常用的用法&#xff1a; 手机USB连接unity&#xff0c;下图可以看到手机型号 可以过滤具体软件的日志

centos stream 8下载安装遇到的坑

早在2020年12月。CentOS 官方发文宣称&#xff1a;“CentOS项目的未来是 CentOS Stream 明年我们会将重点从CentOS Linux 转移到CentOS Stream 它紧随当前 RHEL 版本之前。CentOS Linux 8 作为 RHEL 8 的重建&#xff0c;将于 2021 年底结束。CentOS Stream 在该日期之后继续&a…

信息安全实训室网络攻防靶场实战核心平台解决方案

一、引言 网络安全靶场&#xff0c;作为一种融合了虚拟与现实环境的综合性平台&#xff0c;专为基础设施、应用程序及物理系统等目标设计&#xff0c;旨在向系统用户提供全方位的安全服务&#xff0c;涵盖教学、研究、训练及测试等多个维度。随着网络空间对抗态势的日益复杂化…

视频孪生在景区文件场景中的应用

视频孪生技术在景区的应用主要体现在提升景区的智能化管理和游客的沉浸式体验上‌。依托于视频孪生时空承载平台&#xff0c;可在景区实景三维孪生场景中直观展示景区文物资源、建筑景观、自然景观等资源的类型、数量、空间分布等信息&#xff0c;并可详细查询单体景观详细资料…

电脑excel词典(xllex.dll)文件丢失是或损坏是什么原因?“xllex.dll文件缺失“要怎么解决?

Excel词典&#xff08;xllex.dll&#xff09;文件丢失或损坏&#xff1f;别担心&#xff0c;这里有解决之道&#xff01; 在日常的电脑使用和办公软件操作中&#xff0c;我们偶尔会碰到一些让人头疼的问题&#xff0c;比如Excel突然提示“Excel词典&#xff08;xllex.dll&…

【MySQL】优雅的使用MySQL实现分布式锁

MySQL实现分布式锁 引言二、基于唯一索引2.1、实现思路2.2、代码实现2.3、 测试代码2.4、小结 三、基于悲观锁3.1 、实现思路3.2、代码实现3.3、测试代码3.4、小结 四、基于乐观锁4.1 、实现思路4.2 、代码实现4.3 、测试代码4.4、小结 总结 引言 在文章《Redis实现分布式锁详…

Elasticsearch:使用 Open Crawler 和 semantic text 进行语义搜索

作者&#xff1a;来自 Elastic Jeff Vestal 了解如何使用开放爬虫与 semantic text 字段结合来轻松抓取网站并使其可进行语义搜索。 Elastic Open Crawler 演练 我们在这里要做什么&#xff1f; Elastic Open Crawler 是 Elastic 托管爬虫的后继者。 Semantic text 是 Elasti…

健康养生:拥抱生活的艺术

健康养生&#xff1a;拥抱生活的艺术 在快节奏的现代生活中&#xff0c;健康已成为我们最宝贵的财富。健康养生&#xff0c;不仅仅是一种生活方式的选择&#xff0c;更是一种对待生活的态度&#xff0c;它关乎于如何在日常中寻找到平衡&#xff0c;让身心得以滋养&#xff0c;…

零基础开始学习鸿蒙开发-交友软件页面设计

目录 1.找一张网图&#xff0c;确定大致页面设计 2.页面布局代码详细介绍 3.完整的代码如下 4.最终的运行效果如下图所示 5.总结 1.找一张网图&#xff0c;确定大致页面设计 2.页面布局代码详细介绍 2.1 顶部文字与搜索框布局&#xff0c;在顶部采用行Row组件布局&#xf…

大数据之Hbase环境安装

Hbase软件版本下载地址&#xff1a; http://mirror.bit.edu.cn/apache/hbase/ 1. 集群环境 Master 172.16.11.97 Slave1 172.16.11.98 Slave2 172.16.11.99 2. 下载软件包 #Master wget http://archive.apache.org/dist/hbase/0.98.24/hbase-0.98.24-hadoop1-bin.tar.gz…

【Java服务端开发】深入理解Java中的Server 层的详细分析

目录 1. 什么是服务端&#xff08;Server&#xff09;层&#xff1f; 2. 设计 Server 层的基本原则 2.1 单一职责原则 2.2 面向接口编程 2.3 事务管理 3. 基于 Spring 的 Server 层实现 3.1 示例&#xff1a;创建一个简单的订单服务 3.2 编写 OrderService 3.3 编写 O…

JAVA:代理模式(Proxy Pattern)的技术指南

1、简述 代理模式(Proxy Pattern)是一种结构型设计模式,用于为其他对象提供一种代理,以控制对这个对象的访问。通过代理模式,我们可以在不修改目标对象代码的情况下扩展功能,满足特定的需求。 设计模式样例:https://gitee.com/lhdxhl/design-pattern-example.git 2、什…

XXE练习

pikachu-XXE靶场 1.POC:攻击测试 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe "a">]> <foo>&xxe;</foo> 2.EXP:查看文件 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SY…

Leetcode打卡:形成目标字符串需要的最少字符串数II

执行结果&#xff1a;通过 题目&#xff1a;3292 形成目标字符串需要的最少字符串数II 给你一个字符串数组 words 和一个字符串 target。 如果字符串 x 是 words 中 任意 字符串的 前缀 &#xff0c;则认为 x 是一个 有效 字符串。 现计划通过 连接 有效字符串形成 targ…