图的深度优先遍历

2023-11-08

深度优先查找

原理:深度优先搜索可以从图的任意顶点开始,然后把该顶点标记为已经访问,每次迭代的时候,深度搜索紧接着处理与当前顶点邻接的未访问顶点(如果有若干个顶点,则任意选择一个,也可以按自己的条件选择),让这个过程一直持续,直到遇到一个终点——该点的每个邻接点都被访问过了,然后在该终点上后退一条边,并继续搜索未访问的点,直到返回起点(就是开始搜索的点),直到发现起点的所有邻接点都已经访问过了,此时图的所有联通分量都已经访问过了,如果还有未访问的点,则从此点开始继续上面的过程。

                                                                                 

针对上图的深度优先搜索的过程,其中箭头代表遍历的顺序,曲线或者直线表示该点被访问过了。

                                                                                 


从上面的过程我们可以发现,深度优先搜索是一个递归的过程,因为这个过程的搜索总是搜索到某个位置之后然后在回退到起始的位置。

#include <iostream>
using namespace std;
#define MAX   256

bool flag[MAX];              //标记点是否被使用
typedef struct Graph{
	int adjMatrix[MAX][MAX]; //邻接矩阵
	int n;
}graph;
int main(){
	void DFScore(graph& G, int j);
	void DFS(graph& G);
	graph G;
	G.n = 9;     //八个顶点
	/*创建图,以上图的结构为例*/
	for (int i = 0; i < G.n; i++)
		for (int j = 0; j < G.n; j++)
			G.adjMatrix[i][j] = 0;
	G.adjMatrix[0][1] = 1;
	G.adjMatrix[0][5] = 1;
	G.adjMatrix[1][6] = 1;
	G.adjMatrix[6][5] = 1;
	G.adjMatrix[1][2] = 1;
	G.adjMatrix[1][8] = 1;
	G.adjMatrix[2][8] = 1;
	G.adjMatrix[2][3] = 1;
	G.adjMatrix[8][3] = 1;
	G.adjMatrix[6][3] = 1;
	G.adjMatrix[6][7] = 1;
	G.adjMatrix[3][7] = 1;
	G.adjMatrix[3][4] = 1;
	G.adjMatrix[7][4] = 1;
	G.adjMatrix[5][4] = 1;
	/*由于是无向图,处理对称位置*/
	for (int i = 0; i < G.n; i++)
		for (int j = 0; j < G.n; j++){
		if (G.adjMatrix[i][j] == 1)
			G.adjMatrix[j][i] = 1;
		}
	/*打印一下图的邻接矩阵*/
	for (int i = 0; i < G.n; i++){
		for (int j = 0; j < G.n; j++){
			cout << G.adjMatrix[i][j] << " ";
		}
		cout << endl;
	}
	/*图的深度优先遍历*/
	cout << "G的深度优先遍历顺序为:\n";
	DFS(G);	
}
void DFScore(graph& G,int i){
	flag[i] = true;   //c这个点被用过了
	cout << i << " ";
	/*寻找与j点邻接的点,这种找法总是按顺序来的,也可以在此设置按条件查找*/
	for (int j = 0; j < G.n; j++){
		if (G.adjMatrix[i][j] == 1 && !flag[j])
			DFScore(G, j);
	}
}
void DFS(graph& G){ //最好用引用或者指针,递归调用分分钟就堆栈溢出
	/*初始状态表示全部点都没有被使用*/
	for (int i = 0; i < G.n; i++)
		flag[i] = false;
	for (int j = 0; j < G.n; j++){  //因为编号是从0到8的
		if (!flag[j])
			DFScore(G,j);
	}
}
针对有向图而言,只是在邻接矩阵中纯不纯在通路的问题,算法上是完全没有差别的,是通用的。








本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

图的深度优先遍历 的相关文章

随机推荐

  • DOTA: A Large-scale Dataset for Object Detection in Aerial Images 翻译

    DOTA 用于航空图像中目标检测的大规模数据集 原文 https arxiv org pdf 1711 10398 pdf 官网 https captain whu github io DOTA dataset https captain
  • 链栈的实现--C 语言版,详细讲解+代码实现

    顺序栈的实现 C 语言版 详细讲解 代码实现 例如 第一章 Python 机器学习入门之pandas的使用 文章目录 顺序栈的实现 C 语言版 详细讲解 代码实现 前言 一 结构体定义 二 操作步骤 1 初始化 2 判断栈是否为空 3 入栈
  • 悬铃木超级计算机,陈根:“九章”攻擂“悬铃木”,快一百亿倍的量子霸权

    文 陈根 2019年 谷歌率先宣布实现 量子霸权 量子优越性 一把把量子计算推入公众视野 激起量子计算领域的千层浪 就在近日 中国团队宣布量子计算机 九章 问世 挑战谷歌 量子霸权 实现算力全球领先 九章 作为一台76个光子100个模式的量
  • CCP学习二——通信流程

    1 概述 CCP通信按信息传输方式分为 POLLING 问答 和DAQ方式 按功能模式分为三种 SESSION 会话 CAL 标定 DAQ 查询 工作流程一般为 程序初始化完成后 通过SET S STATE设置节点当前工作状态 Sessio
  • 做研究与写论文【周志华教授】

    本文内容来自于周志华老师在2007年的报告 做研究与写论文 首先讲到研究与研发的区别 其主要区别在于 新 研究 发现新知识 发明新技术 研发 根据已有知识和技术进行研制 开发 科学研究可以扩展人类的知识 没有科学研究就没有技术进步 如何做研
  • 阿里云服务器ECS装好宝塔 但访问不了面板的解决方法

    下载宝塔桌面助手 然后连接你是阿里云服务器输入命令 Centos安装脚本yum install y wget wget O install sh http download bt cn install install sh sh insta
  • 2021-09-06 (1)

    关于计算机的硬盘序列号查找方法 最近应导师要求 帮他查一下计算机的硬盘序列号和Mac地址 咱也没查过 就网上冲浪了一番 结合自己部分使用体验总结为以下三种方法 1 wmic diskpart get serialnumber详细步骤如下 w
  • SpringBoot实现电子发票生成

    在本文中 我们将介绍如何使用Spring Boot开发一个仿真电子发票生成的应用程序 我们将会使用vue作为前端框架 后端使用Spring Boot 并借助微信二维码扫描功能来确保每个发票都是唯一 有效的 此外 我们还将介绍如何使用第三方库
  • Pandas DataFrame处理数据——列处理

    目录 一 插入数据为列 二 新增或修改列 三 对整列进行运算 四 用函数对列中的每个值进行处理 五 选择自己需要的列 六 修改列名 七 删除列 首先导入pandas库 创建一个数据框对象 import pandas as pd data p
  • Java 华为真题-选修课

    需求 现有两门选修课 每门选修课都有一部分学生选修 每个学生都有选修课的成绩 需要你找出同时选修了两门选修课的学生 先按照班级进行划分 班级编号小的先输出 每个班级按照两门选修课成绩和的降序排序 成绩相同时按照学生的学号升序排序 输入描述
  • fegin需要实现类_学习C++ 丨 类(Classes)的定义与实现!C/C++必学知识点!

    一 类 的介绍 在C 中 用 类 来描述 对象 所谓的 对象 是指现实世界中的一切事物 那么类就可以看做是对相似事物的抽象 找到这些不同事物间的共同点 如自行车和摩托车 首先他们都属于 对象 并且具有一定得相同点 和一些不同点 相同点如他们
  • C++ 中调用构造函数有返回值吗?

    C 中的构造函数 最近在面试中问道一个问题 C 中构造函数有返回值吗 例如 class A public A x 1 A int i x i private int x 官方解释在C 标准规定了构造 析构 自定义类型转换符不可以指定返回类型
  • 纠错编码算法——RS编码的Matlab实现

    纠错编码算法 RS编码的Matlab实现 纠错编码是一种将数据加入冗余信息以提高数据传输质量和容错能力的方法 而RS码则是其中一种经典的纠错编码算法 本文将介绍RS码的基本原理 并提供Matlab实现源代码 一 RS编码的原理 RS编码全称
  • 3D人体重建方法漫谈

    转自 https blog csdn net Asimov Liu article details 96442990 1 概述 2 模型匹配的方法 2 1SMPL Skinned Multi Person Linear model 模型 2
  • 过滤器Filter理解

    1 背景 在设计web应用的时候 用户登录 注册是必不可少的功能 对用户登录信息进行验证的方法也是多种多样 大致可以认为如下模式 前端验证 后台验证 根据笔者的经验 一般会在前端进行一些例如是否输入数据 输入的数据的格式是否正确等一系列的验
  • Java用poi导入导出Excel

    前言 1 将用户信息导出为excel表格 导出数据 2 将Excel表中的信息录入到网站数据库 习题上传 开发中经常会设计到excel的处理 如导出Excel 导入Excel到数据库中 操作Excel目前比较流行的就是 Apache POI
  • 小程序设置按钮分享功能

    一般小程序分享可以通过右上角的分享功能进行分享 如果想要在页面内进行按钮设置 可以这样子设置 效果图 WXML中 定义button按钮来触发分享事件 在button标签上写上 open type share 属性
  • 刷题之字符串的排列 以及双指针滑动窗口

    刷题 给你两个字符串 s1 和 s2 写一个函数来判断 s2 是否包含 s1 的排列 如果是 返回 true 否则 返回 false 换句话说 s1 的排列之一是 s2 的 子串 示例 1 输入 s1 ab s2 eidbaooo 输出 t
  • 力扣练习题之数组中找两个数之和等于目标数值详细讲解

    力扣练习题 1 0 题目 给定一个整数数组 nums 和一个整数目标值 target 请你在该数组中找出 和为目标值 target 的那 两个 整数 并返回它们的数组下标 你可以假设每种输入只会对应一个答案 但是 数组中同一个元素在答案里不
  • 图的深度优先遍历

    深度优先查找 原理 深度优先搜索可以从图的任意顶点开始 然后把该顶点标记为已经访问 每次迭代的时候 深度搜索紧接着处理与当前顶点邻接的未访问顶点 如果有若干个顶点 则任意选择一个 也可以按自己的条件选择 让这个过程一直持续 直到遇到一个终点