C++中的深度优先搜索算法

news/2024/7/20 20:24:22 标签: 深度优先, 算法

C++中的深度优先搜索算法

深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。这个算法会尽可能深的搜索树的分支。当节点v的所在边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行直到所有节点都被访问为止。

以下是使用C++实现深度优先搜索的示例代码及其解析:

#include<iostream>  
#include<vector>  
  
using namespace std;  
  
vector<int> adj[100005]; // 邻接表存储图  
bool visited[100005]; // 标记数组,记录每个节点是否被访问过  
  
void dfs(int node) { // 深度优先搜索函数  
    visited[node] = true; // 标记当前节点为已访问  
    cout << node << " "; // 输出当前节点编号  
    int i;  
    for(i = 0; i < adj[node].size(); i++) { // 遍历当前节点的所有邻接点  
        if(!visited[adj[node][i]]) { // 如果邻接点未被访问过,则继续访问  
            dfs(adj[node][i]); // 递归调用dfs函数  
        }  
    }  
}  
  
int main() {  
    int n, m; // n为节点数,m为边数  
    cin >> n >> m;  
    for(int i = 0; i < m; i++) { // 读入m条边,构建邻接表  
        int u, v;  
        cin >> u >> v;  
        adj[u].push_back(v);  
        adj[v].push_back(u); // 对于无向图,还需要将v添加到u的邻接表中  
    }  
    int start; // 开始遍历的节点编号  
    cin >> start; // 读入开始遍历的节点编号  
    for(int i = 1; i <= n; i++) { // 初始化visited数组,将所有节点标记为未访问  
        visited[i] = false;  
    }  
    dfs(start); // 从start节点开始进行深度优先搜索  
    return 0;  
}

代码解析:

  1. 首先定义了一个邻接表adj和一个标记数组visited,用于存储图的信息和记录每个节点是否被访问过。邻接表使用vector数组实现,可以方便的添加和删除邻接点。标记数组使用布尔型数组实现,方便标记和判断节点是否被访问过。
  2. 然后定义了一个深度优先搜索函数dfs,接受一个节点的编号作为参数。首先将当前节点标记为已访问,然后输出当前节点的编号,接着遍历当前节点的所有邻接点。如果邻接点未被访问过,则递归调用dfs函数进行深度优先搜索。这个过程一直持续到当前节点的所有邻接点都被访问过为止。
  3. 在主函数中,首先读入节点的数量和边的数量,然后读入每条边的两个端点,将它们添加到邻接表中。注意对于无向图,还需要将第二个端点添加到第一个端点的邻接表中。然后初始化标记数组,将所有节点标记为未访问。最后从用户输入的起始节点开始进行深度优先搜索。

http://www.niftyadmin.cn/n/5316730.html

相关文章

【服务器数据恢复】Hyper-V虚拟化数据恢复案例

服务器数据恢复环境&#xff1a; Windows Server操作系统服务器&#xff0c;部署Hyper-V虚拟化环境&#xff0c;虚拟机的硬盘文件和配置文件存放在某品牌MD3200存储中&#xff0c;MD3200存储中有一组由4块硬盘组成的raid5阵列&#xff0c;存放虚拟机的数据文件&#xff1b;另外…

vue上传文件时显示上传进度

要在Vue中显示文件上传进度&#xff0c;可以使用axios库来处理文件上传&#xff0c;并使用axios的onUploadProgress方法获取上传进度。 首先&#xff0c;确保你已经安装了axios库。可以使用npm或yarn安装&#xff0c;在终端中运行以下命令&#xff1a; npm install axios或者…

【Spring Boot】SpringBoot maven 项目创建图文教程

创建一个Spring Boot项目并使用Maven进行构建是一项相对简单的任务。以下是使用IntelliJ IDEA创建Spring Boot Maven项目的详细教程&#xff1a; 步骤 1&#xff1a;安装 IntelliJ IDEA 确保你已经安装了最新版本的 IntelliJ IDEA。你可以从官方网站下载并安装。 步骤 2&am…

输电线路分布式故障诊断装置的四大特点介绍-深圳鼎信

输电线路分布式故障诊断装置是一种利用行波测距、无线通信等技术手段实现电网故障定位的设备。这对于电网的故障处理和恢复具有重要意义&#xff0c;可以帮助运维人员提高故障处理的效率&#xff0c;缩短故障处理时间&#xff0c;减少停电时间&#xff0c;提高用户的供电可靠性…

09、Kafka ------ 通过修改保存时间来删除消息(retention.ms 配置)

目录 通过修改保存时间来删除消息★ 删除指定主题的消息演示1、修改kafka检查过期消息的时间间隔2、修改主题下消息的过期时间3、查看修改是否生效4、先查看下主题下有没有消息5、添加几条消息看效果6、查看消息是否被删除 ★ 恢复主题的retention.ms配置1、先查看没修改前的te…

多维时序 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量时间序列预测

多维时序 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量时间序列预测 目录 多维时序 | Matlab实现RIME-HKELM霜冰算法优化混合核极限学习机多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现RIME-HKELM霜冰算法优化混合核极限学…

Camunda Event Based Gateway

一&#xff1a;bpmn 二&#xff1a;java 如果没有收到信号&#xff0c;超过等待时间&#xff0c;流程进入总经理审批&#xff0c;如果在等待时间内收到信号&#xff0c;流程进入副总经理审批。 示例1&#xff1a;发送信号事件&#xff0c;流程进入副总经理审批。 repository…

12. VTK上选取点(VTK7版本+VTK9版本)

这个专栏是用于记录我在学习VTK过程中的一些心得体会。参考的资料主要有以下三个&#xff1a; 1. 张晓东 罗火灵《VTK图形图像开发进阶》2. https://examples.vtk.org/site/3. 沈子恒 《VTK 三维数据渲染进阶》 遇到的一个大问题就是由于版本更新&#xff0c;这些资料中很多代…