深度优先算法-DFS(算法篇)

算法之深度优先算法

深度优先算法(DFS)

概念

  • 深度优先算法(DFS)跟BFS算法一样是用于遍历图的算法,但是DFS并不像BFS算法一样,它搜索出来的路径不具有最短性,并且dfs算法类似于枚举,因此DFS算法一般用于求出问题的所有路径(例如全排列)

  • 深度优先算法就是从起点出发,选择与其邻接的一条路径进行搜索将该路径搜索完(没有路了或者是个回路),再进行回退重新选择其他路径搜索。这样就需要使用递归实现,而判断是否访问过顶点就需要一个bool类型的数组vis进行记录

  • 对于非强连通图,那么可能在某个节点开始的深度优先搜索可能访问不了所有的节点,在这种情况,我们选取某个未被访问的节点开始,再执行深度优先搜索。

  • dfs中最重要的算法思想是回溯和剪枝,dfs+回溯+剪枝也可以用于求解最短路径,但是BFS的时间复杂度更低。

    1. 回溯是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。
    2. 剪枝,就是减小搜索树规模、尽早排除搜索树中不必要的分支的一种手段。形象地看,就好像剪掉了搜索树的枝条,故称之为“剪枝”

具体操作

  • 访问图中某一起始点v后,由v出发访问它的任一邻接点w1;
  • 再从w1出发访问与w1邻接但还未被访问过的顶点w2
  • 然后再从w2出发,进行类似的访问
  • 如此进行下去,直至到达所有的邻接顶点都被访问过的顶点u为止
  • 接着,退回一步,退到前一次刚访问过的顶点,看是否还有其他没有被访问的邻接顶点。
  • 如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;
  • 如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。

实现代码

邻接矩阵表示图的算法实现

bool vis[g.vexnum];   //记录顶点访问信息,需要初始化为false//图g为邻接矩阵类型,v为访问顶点
void dfs(Graph g,int v){cout<<v;vis[v]=true;//依次检查邻接矩阵v所在行。for(int w=0;w<g.vexnum;w++){//w是v的邻接点,如果w未访问,则递归调用dfsif(g.arcs[v][w]!=0&&!vis[w]){dfs(g,w);}}
}

邻接表表示图的算法实现

void DFS(int v){cout<<v;an[v].flag= true;listnode* p=an[v].next;while (p!= nullptr){if(!an[p->data].flag){DFS(p->data);}p=p->next;}}

尾言

完整版笔记也就是数据结构与算法专栏完整版可到我的博客进行查看,或者在github库中自取(包含源代码)

  • 博客1: codebooks.xyz
  • 博客2:moonfordream.github.io
  • github项目地址:Data-Structure-and-Algorithms

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

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

相关文章

雅思词汇及发音积累 2024.7.11

计算机房 computer lab 计算机房 mainframe 主机 monitor 屏幕 screen 键盘 keyboard 键盘 mouse 鼠标 memory 内存 loudspeaker 扬声器 printer 打印机 scanner 扫描仪 photocopier/copier 复印机 laser printer 激光打印机 software programme 程序 viruses /ˈvaɪərəsɪz…

linux ssh 远程执行shell 获取返回值

#!/bin/bashSCRIPTcd / && lsresult$(ssh -o StrictHostKeyCheckingno root10.204.0.1 $SCRIPT) echo "result: $result"或者下面# 远程服务器的IP地址或主机名 HOSTremote_host # 远程服务器的用户名 USERusername # 远程执行的脚本 SCRIPT/path/to/remote/…

Hadoop的HA模式搭建

准备三台虚拟机 bigdata007&#xff0c;bigdata008&#xff0c;bigdata009 1.前置工作 1.修改虚拟机的IP地址和hostname 2.配置集群中的ip映射&#xff08;/etc/hosts&#xff09; 192.168.111.57 bigdata007 192.168.111.58 bigdata008 192.168.111.59 bigdata0093.关闭虚拟…

武夷山细节决定成败抓质量求生存

在当今竞争激烈的市场环境中&#xff0c;细节决定成败&#xff0c;质量求生存的理念已成为企业发展的关键。蓝鹏测控科技有限公司&#xff0c;一家专业从事工业测量领域的高新技术企业&#xff0c;正是秉持这一理念&#xff0c;在工业测径仪领域取得了显著成就。 蓝鹏测控科技…

pandas修改时间索引报错处理

import pandas as pd import numpy as np import osdfpd.DataFrame(index[a,b,c],data{序列:[1,2,3]}) df.rename(index{a:a1},inplaceTrue) print(df) print(df.index.dtype)df1pd.DataFrame(index[2024-01-01,2024-01-02,2024-01-03],data{序列:[1,2,3]}) df1.rename(index{2…

Excel——REPLACE函数实现敏感信息打码

第一步&#xff1a; 以素材Excel文档为例。 在F2单元格中输入函数“REPLACE(B2,4,5,"*****")”&#xff0c;输入完毕后&#xff0c;按Enter键开始计算&#xff0c;并使用填充柄对其他区域进行填充。 这个函数的意思是&#xff1a;从第4位数字开始的5个数字用5个“…

医院门诊预约挂号小程序模板源码

医院门诊预约挂号小程序模板源码,主要有&#xff1a;绿色的医院住院办理&#xff0c;门诊预约挂号微信小程序页面模板。包含&#xff1a;办卡绑定、快速办理预约挂号、门诊缴费、住院服务、医院信息、个人中心、添加就诊人、找医生等等。 医院门诊预约挂号小程序模板源码

Elasticsearch:使用 Filebeat 从 Node.js Web 应用程序提取日志

本指南演示了如何从 Node.js Web 应用程序中提取日志并将其安全地传送到 Elasticsearch Service 部署中。你将设置 Filebeat 来监控具有标准 Elastic Common Schema (ECS) 格式字段的 JSON 结构日志文件&#xff0c;然后在向 Node.js 服务器发出请求时&#xff0c;你将在 Kiban…

Doris安装部署

Doris安装部署 1、 MPP概念2.Doris简要介绍 1、 MPP概念 MPP (Massively Parallel Processing)&#xff0c;即大规模并行处理&#xff0c;在数据库非共享集群中&#xff0c;每个节点都有独立的磁盘存储系统和内存系统&#xff0c;业务数据根据数据库模型和应用特点划分到各个节…

无人机之电池保养

一、充电时 1、推荐使用官方充电器和充电管家 2、充电时确保电池处于关闭状态 3、冷却后再充电理想充电温度22-28度 二、使用时 1、首次使用需要充电唤醒电池 2、切勿将电池耗尽过放容易造成电池鼓包 三、储存时 1、存放在环境干燥通风的地方 2、不使用时每两个月充一…

华为机考真题 -- 查找众数及中位数

题目描述: 1.众数是指一组数据中出现次数量多的那个数,众数可以是多个 2.中位数是指把一组数据从小到大排列,最中间的那个数,如果这组数据的个数是奇数,那 最中间那个就是中位数,如果这组数据的个数为偶数,那就把中间的两个数之和除以 2,所 得的结果就是中位数 3.查找…

qt 绘制一个自定义的控件

1.qt 绘制一个自定义的控件 要点 QPainter painter(this); painter.setPen(Qt::NoPen); painter.setBrush(Qt::red); painter.drawRect(rect()); / 在 Qt 中绘制一个自定义的控件通常涉及几个步骤。下面是一个基本的指南&#xff0c;说明如何创建…

谷粒商城实战-25-分布式组件-SpringCloud Alibaba-Nacos配置中心-加载多配置集

文章目录 一&#xff0c;拆分配置集二&#xff0c;配置文件中配置多配置集1&#xff0c;引用多配置集2&#xff0c;验证 三&#xff0c;多配置集总结1&#xff0c;使用场景2&#xff0c;优先级 这一节介绍如何加载多个配置集。 大多数情况下&#xff0c;我们把配置全部放在一个…

vite build 打包错误提示 EBUSY: resource busy or locked, copyfile ‘D:\gtv-web

EBUSY: resource busy or locked, copyfile D:\gtv-web 报错解释&#xff1a; 当前应用正在运行中&#xff0c;把应用进程关掉即可 EBUSY: resource busy or locked 错误表明尝试使用的资源正被另一个进程占用或锁定。在这种情况下&#xff0c;copyfile 命令试图复制文件到指…

C语言 结构体和共用体——对结构体的操作

目录 如何访问结构体的成员&#xff1f; 结构体变量的赋值操作 结构体变量的取地址值操作 如何访问结构体的成员&#xff1f; 结构体变量的赋值操作 结构体变量的取地址值操作

华为机考真题 -- 堆内存申请

题目描述: 有一个总空间为100字节的堆,现要从中新申请一块内存,内存分配原则为:优先紧接着前一块已使用内存,分配空间足够且最接近申请大小的空闲内存。 输入描述: 第1行是1个整数,表示期望申请的内存字节数 第2到第N行是用空格分割的两个整数,表示当前已分配的内存…

华为机考真题 -- 简易内存池

题目描述: 请实现一个简易内存池,根据请求命令完成内存分配和释放。内存池支持两种操作命令,REQUEST和RELEASE,其格式为: REQUEST=请求的内存大小,表示请求分配指定大小内存. 如果分配成功,返回分配到的内存首地址; 如果内存不足,或指定的大小为0,则输出error; R…

如何为谷歌seo打好基础?

选择获取一个合适的域名&#xff0c;选择一个好的域名是 SEO 成功的第一步。以下是一些建议&#xff1a; 域名名称&#xff1a;要短小易记&#xff0c;不要强行插入关键词。最好用你的公司名称&#xff0c;避免使用连字符或特殊字符。用户在输入一个复杂的域名时容易出错&…

FastAPI -- 第一弹

Hello World 经典的 Hello World 安装 pip install fastapi pip install "uvicorn[standard]"main.py from typing import Unionfrom fastapi import FastAPIapp FastAPI()app.get("/") def read_root():return {"Hello": "World"}…

【React Hooks原理 - useReducer】

概述 众所周知useState是基于useReducer来实现状态更新的&#xff0c;在前面我们介绍过useState的原理&#xff0c;所以在这里介绍下useReducer。本文主要从基础使用入手&#xff0c;再进一步从源码来看useReducer实现原理两个方面来介绍useReducer这个Hook。由于本文省略了部…