图的深度优先遍历

article/2025/9/20 7:30:18

一 图遍历介绍

所谓图的遍历,即是对结点的访问。一个图有那么多个结点,如何遍历这些结点,需要特定策略,一般有两种访问策略。

1 深度优先遍历 

2 广度优先遍历

二 深度优先遍历基本思想

图的深度优先搜索(Depth First Search) ,简称DFS。

1 深度优先遍历,从初始访问结点出发,初始访问结点可能有多个邻接结点,深度优先遍历的策略就是首先访问第一个邻接结点,然后再以这个被访问的邻接结点作为初始结点,访问它的第一个邻接结点。可以这样理解:每次都在访问完当前结点后首先访问当前结点的第一个邻接结点。

2 该访问策略是优先往纵向挖掘深入,而不是对一个结点的所有邻接结点进行横向访问。

3 深度优先搜索是一个递归的过程。

三 深度优先遍历算法步骤

1 访问初始结点v,并标记结点v为已访问。

2 查找结点v的第一个邻接结点w。

3 若w存在,则继续执行4,如果w不存在,则回到第1步,将从v的下一个结点继续。

4 若w未被访问,对w进行深度优先遍历递归(即把w当做另一个v,然后进行步骤1、2、3)。

5 查找结点v的w邻接结点的下一个邻接结点,转到步骤3。

四 实战

1 要求

对下图进行深度优先搜索, 从A 开始遍历。

2 思路分析

3 代码

import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;/**
* @className: Graph
* @description: 图
* @date: 2021/3/28
* @author: cakin
*/
public class Graph {// 存储顶点集合private ArrayList<String> vertexList;// 存储图对应的邻结矩阵private int[][] edges;// 表示边的数目private int numOfEdges;// 表示某个结点是否被访问private boolean[] isVisited;/*** 功能描述:图的擦拭** @param args 命令行* @author cakin* @date 2021/3/28*/public static void main(String[] args) {// 顶点String Vertexs[] = {"A", "B", "C", "D", "E"};//String Vertexs[] = {"1", "2", "3", "4", "5", "6", "7", "8"};// 结点的个数int n = Vertexs.length;// 创建图对象Graph graph = new Graph(n);// 循环的添加顶点for (String vertex : Vertexs) {graph.insertVertex(vertex);}// 添加边graph.insertEdge(0, 1, 1); // A-Bgraph.insertEdge(0, 2, 1); // A-Cgraph.insertEdge(1, 2, 1); // B-Cgraph.insertEdge(1, 3, 1); // B-Dgraph.insertEdge(1, 4, 1); // B-E// 显示邻结矩阵graph.showGraph();// dfs测试System.out.println("dfs:");graph.dfs(); // A->B->C->D->E}// 构造器public Graph(int n) {// 初始化矩阵edges = new int[n][n];// 初始化 vertexListvertexList = new ArrayList<>(n);// 边的数量numOfEdges = 0;}/*** 功能描述:得到某个顶点的第一个邻接结点的下标 w** @param index 顶点索引* @return 如果存在就返回对应的下标,否则返回-1*/public int getFirstNeighbor(int index) {for (int j = 0; j < vertexList.size(); j++) {if (edges[index][j] > 0) {return j;}}return -1;}/*** 功能描述:根据前一个邻接结点的下标来获取下一个邻接结点** @param v1 第1个顶点* @param v2 第2个顶点,也就是邻节点* @return int 邻节点的下一个邻节点* @author cakin* @date 2021/3/29*/public int getNextNeighbor(int v1, int v2) {for (int j = v2 + 1; j < vertexList.size(); j++) {if (edges[v1][j] > 0) {return j;}}return -1;}/*** 功能描述:深度优先遍历算法** @author cakin* @date 2021/3/29* @param isVisited 节点是否被访问数组* @param i 被访问节点的下标* @return* @description:*/private void dfs(boolean[] isVisited, int i) {// 输出被访问节点System.out.print(getValueByIndex(i) + "->");// 将该结点设置为已经访问isVisited[i] = true;// 查找结点i的第一个邻接结点wint w = getFirstNeighbor(i);while (w != -1) { // 找到该邻节点if (!isVisited[w]) {// 递归进行深度优先遍历算法dfs(isVisited, w);}// 如果w结点已经被访问过,找下一个邻节点w = getNextNeighbor(i, w);}}/*** 功能描述:对 dfs 进行一个重载, 遍历所有的结点,并进行 dfs** @author cakin* @date 2021/3/29*/public void dfs() {isVisited = new boolean[vertexList.size()];// 遍历所有的结点,进行 dfsfor (int i = 0; i < getNumOfVertex(); i++) {if (!isVisited[i]) {dfs(isVisited, i);}}}/*** 功能描述:返回结点的个数** @author cakin* @date 2021/3/28*/public int getNumOfVertex() {return vertexList.size();}/*** 功能描述:显示图对应的矩阵** @author cakin* @date 2021/3/28*/public void showGraph() {for (int[] link : edges) {System.err.println(Arrays.toString(link));}}/*** 功能描述:得到边的数目** @return 得到边的数目* @author cakin* @date 2021/3/28*/public int getNumOfEdges() {return numOfEdges;}/*** 功能描述:返回结点i(下标)对应的数据** @param i 节点下标* @return 节点对应的数据* @author cakin* @date 2021/3/28* @description: 举例如下:* 0->"A" 1->"B" 2->"C"*/public String getValueByIndex(int i) {return vertexList.get(i);}/*** 功能描述:返回v1和v2的权值** @param v1 第1个顶点的下标* @param v2 第2个顶点的下标* @return int 两个顶点间的权值* @author cakin* @date 2021/3/28*/public int getWeight(int v1, int v2) {return edges[v1][v2];}/*** 功能描述:插入结点** @param vertex 节点的数据* @author cakin* @date 2021/3/28*/public void insertVertex(String vertex) {vertexList.add(vertex);}/*** 功能描述:添加边** @param v1     第1个顶点对应的下标* @param v2     第2个顶点对应的下标* @param weight 表示第1个顶点和第2个顶点的权重*/public void insertEdge(int v1, int v2, int weight) {edges[v1][v2] = weight;edges[v2][v1] = weight;numOfEdges++;}
}

4 测试

[0, 1, 1, 0, 0]
[1, 0, 1, 1, 1]
[1, 1, 0, 0, 0]
[0, 1, 0, 0, 0]
[0, 1, 0, 0, 0]
dfs:
A->B->C->D->E->

 


http://chatgpt.dhexx.cn/article/ADFbMjdJ.shtml

相关文章

图的遍历 ——深度优先遍历

图的遍历 ——深度优先遍历 深度优先搜索&#xff08;Depth First Search&#xff0c;DFS&#xff09;是最常见的图搜索方法之一。 深度优先搜索沿着一条路径一直搜索下去&#xff0c;在无法搜索时&#xff0c;回退到刚刚访问过的节点。深度优先遍历是按照深度优先搜索的方式…

二、图的遍历——深度优先遍历

深度优先遍历&#xff0c;也有称为深度优先搜索&#xff0c;简称为DFS。 深度优先遍历其实就是一个递归的过程&#xff0c;它从图中某个顶点ⅴ出发&#xff0c;访问此顶点&#xff0c;然后从V的未被访问的邻接点出发深度优先遍历图&#xff0c;直至图中所有和V有路径相通的顶点…

图的遍历(深度优先遍历DFS,广度优先遍历BFS)以及C语言的实现

遍历的定义&#xff1a; 从已给的连通图中某一顶点出发&#xff0c;沿着一些边访遍图中所有的顶点&#xff0c;且使每个顶点仅被访问一次&#xff0c;就叫做图的遍历&#xff0c;它是图的基本运算&#xff0e; 一:深度优先遍历&#xff08;&#xff24;&#xff26;&#xff…

使用SSM框架上传图片

使用SSM框架上传图片 为了大家方便对照,我上传源码到网盘,有兴趣的自取. ps:其中有一个存储数据的网页,我没删除,可以忽略 链接&#xff1a;https://pan.baidu.com/s/1u24E8mUs4K-raoQgx-ae2A 提取码&#xff1a;java 建数据表 CREATE DATABASE my_resource;USE my_resource…

SSM框架简单介绍

一. SSM框架简介及特征 1.SpringMVC Spring MVC属于SpringFrameWork的后续产品&#xff0c;已经融合在Spring Web Flow 里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构&#xff0c;从而在使用Spring进行WEB开发时&#xff0c;可…

SSM框架整合详细教程

目录 1. 什么是SSM&#xff1f; 2. SSM整合的时候容器之间如何访问 3. SSM下面的开发步骤 4. SSM整合时候时容易混乱的知识点 1. 什么是SSM&#xff1f; SSM是对三个框架名字的简写&#xff0c;其中第一个S指的是SpringMVC,第二个S指的是Spring&#xff0c;第三个M指的是M…

SSM框架理解

一、作用&#xff1a; 1、 SSM是spingspringMVCmybatis集成的框架。是标准的MVC模式&#xff0c;将整个系统划分为表现层&#xff0c;controller层&#xff0c;service层&#xff0c;DAO层四层。 2、使用spring MVC负责请求的转发和视图管理&#xff0c;spring实现业务对象管理…

SSM框架初探

SSM 框架初探 SSM框架简介对框架的理解为什么使用 SSM 框架 SpringSpringMVCMybatis SSM框架简介 SSM框架一种以java语言作为后端搭建基本语言的应用系统搭建框架。是继SSH(strutsspringhibernate)之后&#xff0c;目前较为主流的Java EE企业级框架&#xff0c;适用于搭建各种大…

SSM框架整合

今天来整合一下SSM三大框架~~ 1、创建一个maven项目 比较简单就不赘述了&#xff0c;创建的时候选择webapp骨架。 用骨架创建的项目&#xff0c;在创建完之后要更新一下web.xml 模板目录&#xff1a;“你的Tomcat安装目录\webapps\ROOT\WEB-INF\web.xml” 2、项目整体结构 按…

SSM框架原理

SSM框架是spring MVC &#xff0c;spring和mybatis框架的整合&#xff0c;是标准的MVC模式&#xff0c;将整个系统划分为表现层&#xff0c;controller层&#xff0c;service层&#xff0c;DAO层四层 使用spring MVC负责请求的转发和视图管理 spring实现业务对象管理&#xff…

SSM框架总结

一&#xff1a;什么是SSM框架&#xff1f; SSM框架是Spring、SpringMVC和MyBatis框架的总结&#xff0c;是比较标准的MVC模式。 标注的SSM框架有四层&#xff1a;dao&#xff08;mapper&#xff09;层、service层、controller层、domain(entity)层。 使用Spring实现业务对象…

SSM框架详解

SSM框架详解 写在前面&#xff1a;当初整理SSM原理时&#xff0c;参考了网上一些前辈的文章&#xff0c;时间久远已经忘记来源&#xff0c;所以文中原理部分如有侵权请联系我删除。 基于SSM框架的仿天猫商城网站电商后台管理系统 本文视频讲解 文章目录 SSM框架详解 一、项…

java ssm框架论文,ssm框架理解

文章简介: SSM框架集简介 spring框架IOC的理解 mybatis框架sqlSessionFactory理解 Tomcat的理解 图解SSM SSM框架常用注解 1.SSM框架集简介 SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的…

SSM框架详细讲解

SSM框架 文章目录 SSM框架&#xff08;白痴都看完都会&#xff09;介绍SSM框架<原理>一、什么是SSM框架&#xff1f; 1.Spring2.Spring MVC3.Mybatis &#xff08;核心是SqlSession&#xff09;二、代码实战 1.创建配置工程2.代码实战&#xff08;查询记录数&#xff0…

SSM三大框架超详细总结(适合你重新回顾)

目录 1.1 概念 1.2 Mybatis优点 1.3 Mybatis架构 1.4 底层原理 1.5 Mybatis缓存 1.6 常见面试题 2.1 概念 2.2 Spring优点 2.3 Spring架构 2.4 控制反转&#xff08;IOC&#xff09; 2.5 DI依赖注入 2.6 底层原理(常见面试题) 8、如何用基于 Java 配置的方式配置 Spring&#…

SSM框架整合思想及步骤

前言 SSM框架即是将SpringMVC框架、Spring框架、MyBatis框架整合使用。以简化在web开发中繁琐、重复的操作&#xff0c;让开发人员的精力专注于业务处理的开发上。 一、SSM框架的思想 ssm框架根据SpringMVC、Spring、MyBatis三者各自的特性及应用场景对其操作的的业务进行了分…

SSM框架简介

一、Java SSM框架的概念 Java SSM框架即指SpringSpringMVCMyBatis的简称&#xff0c;框架集由Spring、MyBatis两个开源框架整合而成&#xff08;SpringMVC是Spring中的部分内容&#xff09;,常作为数据源较简单的web项目的框架。 相比于之前的SSH&#xff08;SpringStrutsHibe…

SSM框架讲解(史上最详细的文章)

SSM框架&#xff08;白痴都看完都会&#xff09; 文章目录 SSM框架&#xff08;白痴都看完都会&#xff09;介绍SSM框架<原理>一、什么是SSM框架&#xff1f;1.Spring2.Spring MVC3.Mybatis &#xff08;核心是SqlSession&#xff09; 二、代码实战1.创建配置工程2.代码实…

MySQL安装教程(超详细教程)

MySQL详细安装步骤 - windows(MySQL Installer for Windows)附链接 1.下载所需要的版本(可自选&#xff0c;5.7.29为稳定版本)下载链接&#xff0c;运行程序 2.个人学习使用server only&#xff0c;如果不确定需求&#xff0c;则选择full&#xff0c;全部安装&#xff1b;Next …

Mysql详细安装教程

&#x1f973;&#x1f973;&#x1f973; 茫茫人海千千万万&#xff0c;感谢这一刻你看到了我的文章&#xff0c;感谢观赏 &#x1f60f;。 &#x1f449; 作者简介&#xff1a;最爱吃鱼罐头。(抱歉&#xff0c;我真的吃鱼罐头&#x1f92b;) &#x1f97a; 本人不才&#xff…