DFS VS BFS

实际案例

在这里插入图片描述

代码实现

package com.atguigu.graph;import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;/*** @创建人 wdl* @创建时间 2021/4/2* @描述*/
public class Graph {private ArrayList<String> vertexList;//存储顶点集合private int[][] edges;//存储图对应的邻接矩阵private int numOfEdges;//表示边的数目//定义一个Boolean数组,记录某个节点是否被访问private boolean[] isVisited;public static void main(String[] args) {//测试一把图是否创建OKint n=8;//节点的个数
//        String Vertexs[]={"A","B","C","D","E"};String Vertexs[]={"1","2","3","4","5","6","7","8"};//创建图对象Graph graph = new Graph(n);//循环的添加顶点for(String vertex:Vertexs){graph.insertVertex(vertex);}//添加边
//        graph.insertEdge(0,1,1);
//        graph.insertEdge(0,2,1);
//        graph.insertEdge(1,2,1);
//        graph.insertEdge(1,3,1);
//        graph.insertEdge(1,4,1);//更新边的关系graph.insertEdge(0, 1, 1);graph.insertEdge(0, 2, 1);graph.insertEdge(1, 3, 1);graph.insertEdge(1, 4, 1);graph.insertEdge(3, 7, 1);graph.insertEdge(4, 7, 1);graph.insertEdge(2, 5, 1);graph.insertEdge(2, 6, 1);graph.insertEdge(5, 6, 1);//显示一把邻接矩阵graph.showGraph();//测试一把,我们的dfs遍历是否OKSystem.out.println("深度优先");graph.dfs();System.out.println();//测试一把,我们的bfs遍历是否OKSystem.out.println("广度优先");graph.bfs();}//构造器public Graph(int n) {//初始化矩阵和vertexListedges = new int[n][n];vertexList = new ArrayList<>(n);numOfEdges=0;
//        isVisited=new boolean[5];}//得到第一个邻接节点的下标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;}//根据前一个邻接节点的下标来获取下一个邻接节点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;}//深度优先遍历算法//i 第一次就是0public 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进行一个重载,遍历我们所有的节点,并进行dfspublic void dfs(){isVisited=new boolean[vertexList.size()];//遍历所有的节点,进行dfs[回溯]for (int i = 0; i < getNumOfVertex(); i++) {if(!isVisited[i]){dfs(isVisited,i);}}}//对一个节点进行广度优先遍历的方法public void bfs(boolean[] isVisited,int i){int u;//表示队列的头节点对应下标int w;//邻接节点w//队列,记录节点访问的顺序LinkedList queue = new LinkedList();//访问节点,输出节点信息System.out.print(getValueByIndex(i)+"=>");//标记为已访问isVisited[i]=true;//将节点加入队列queue.addLast(i);while (!queue.isEmpty()){//取出队列的头节点下标u = (Integer) queue.removeFirst();//得到第一个邻接点的下标ww=getFirstNeighbor(u);while (w!=-1){//找到了//是否访问过if(!isVisited[w]){System.out.print(getValueByIndex(w)+"=>");//标记已经访问isVisited[w]=true;//入队queue.addLast(w);}//以u为前驱点,找w后面的下一个邻接点w=getNextNeighbor(u,w);//体现出我们的广度优先}}}//遍历所有的节点,都进行广度优先搜索public void bfs(){isVisited=new boolean[vertexList.size()];for (int i = 0; i < getNumOfVertex(); i++) {if(!isVisited[i]){bfs(isVisited,i);}}}//图中常用的方法//返回节点的个数public int getNumOfVertex(){return vertexList.size();}//显示图对应的矩阵public void showGraph(){for(int[] link:edges){System.out.println(Arrays.toString(link));}}//得到边的数目public int getNumOfEdges(){return numOfEdges;}//返回节点i(下标)对应的数据public String getValueByIndex(int i){return vertexList.get(i);}//返回v1和v2的权值public int getWeight(int v1,int v2){return edges[v1][v2];}//插入节点public void insertVertex(String vertex){vertexList.add(vertex);}//添加边/**** @param v1 表示点的下标是第几个顶点 "A"-"B"  "A"->0 "B"->1* @param v2 第二个顶点对应的下标* @param weight*/public void insertEdge(int v1,int v2,int weight){edges[v1][v2]=weight;edges[v2][v1]=weight;numOfEdges++;}}

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

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

相关文章

CLR运行时细节 - Method Descriptor

方法描述符:MethodDesc 运行时用来描述类型的托管方法,它保存在方法描述桶(MethodDescChunk)内;方法描述符保存了方法在运行时的一些重要信息:是否JIT编译;是否有方法表槽(决定了方法入口是跟在方法描述符(MethodDesc)后还是在方法表(MethodTable)后面);距离MethodDescChunk的索…

beanutil 批量copy_BeanUtils.copyProperties 需要getset方法支持

今天在调用这个方法时&#xff0c;发现属性没有映射上&#xff0c;结果一看是model类没有加上getset方法 PropertyDescriptor[] targetPds getPropertyDescriptors(actualEditable); List ignoreList (ignoreProperties ! null ? Arrays.asList(ignoreProperties) : null);f…

ssm(Spring+Spring mvc+mybatis)mybatis配置文件——mybatis-config.xml

<?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration><settings><!-- 打印查…

2015蓝桥杯省赛---java---B---3(三羊献瑞)

题目 三羊献瑞 思路分析 由于是填空题&#xff0c;没有时间和内存的要求&#xff0c;所以看到这个题&#xff0c;第一想法就是暴力破解&#xff0c;当然了&#xff0c;怎么快就怎么做。 由于 "三"是数字的首位&#xff0c;低位的数字进位后必然为1&#xff0c;所…

Spring @Qualifier 注释

转载自 Spring Qualifier 注释 Spring Qualifier 注释 可能会有这样一种情况&#xff0c;当你创建多个具有相同类型的 bean 时&#xff0c;并且想要用一个属性只为它们其中的一个进行装配&#xff0c;在这种情况下&#xff0c;你可以使用 Qualifier 注释和 Autowired 注释通…

mysql common是什么_MySQL common_schema简介

common_schema为MySQL提供了查询脚本&#xff0c;分析并且信息化的视图和一个函数库&#xff0c;以便更容易的管理和诊断。它引入的一些基于SQL的工具简common_schema的简介&#xff1a;Shlomi Noach 的common_schema项目()是一套针对服务器脚本化和管理的强大的代码和视图。co…

ssm(Spring+Spring mvc+mybatis)——web.xml

<?xml version"1.0" encoding"UTF-8"?> <web-app version"3.0" xmlns"http://java.sun.com/xml/ns/javaee" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation"http://java.sun.co…

数据库权限分配探讨

上周&#xff0c; 有位朋友给我提出了这样的需求&#xff1a;区分用户访问数据库的权限。顺便总结了下有如下要求&#xff1a; 某个用户查询所有数据库的权限 某个用户只有备份数据库的权限 给一个用户只能查看指定数据库的权限 给一个用户只有某个表的权限 要进行以上任务&…

2015蓝桥杯省赛---java---B---6(加法变乘法)

题目 加法变乘法 思路分析 两个算式进行相减操作 代码实现 package com.atguigu.lanqiao;public class Main { // 简单枚举public static void main(String[] args) {for (int i 1; i < 46; i) {for (int j i 2; j < 48; j) {if (i * (i 1) - (i i 1) j * (…

DI 之Spring更多DI的知识

转载自 【第三章】 DI 之 3.3 更多DI的知识 ——跟我学spring3 3.3.1 延迟初始化Bean 延迟初始化也叫做惰性初始化&#xff0c;指不提前初始化Bean&#xff0c;而是只有在真正使用时才创建及初始化Bean。 配置方式很简单只需在<bean>标签上指定 “lazy-init” 属性值…

mysql使用游标的访问过程_mysql存储过程中使用游标的实例_MySQL

bitsCN.comDELIMITER $$DROP PROCEDURE IF EXISTS getUserInfo $$CREATE PROCEDURE getUserInfo(in date_day datetime)---- 实例-- MYSQL存储过程名为&#xff1a;getUserInfo-- 参数为&#xff1a;date_day日期格式:2008-03-08--BEGINdeclare _userName varchar(12); -- 用户…

Microsoft发布新工具,简化JavaScript Web应用的创建

Microsoft发布了一系列工具用于快速生成基于JavaScript的Web应用&#xff0c;这些工具包含了dotnet new和对Node.js的巧妙运用。 dotnet new命令是.NET Core工具的一部分&#xff0c;它用简单的命令行语法创建&#xff08;spin up&#xff09;新项目。现在新工具已成为ASP.NET …

2015蓝桥杯省赛---java---B---7(牌型种数)

题目 牌型种数 思路分析 递归进行实现&#xff0c;弄好终止条件&#xff0c;牌的数目等于13 代码实现 package com.atguigu.lanqiao;public class Main { // 简单枚举private static int ans;public static void main(String[] args) {f(0, 0);System.out.println(ans);}…

mysql删除数据表show_数据库与表显示、创建、删除

# 数据库与表显示、创建、删除## 数据库显示> **show databases;**mysql> show databases;--------------------| Database |--------------------| information_schema || app_blogcurder || auth_demo || canzhieps || cmsdemo || mysql || onethink || performance_sc…

零配置 之 Spring 注解实现Bean依赖注入

转载自 【第十二章】零配置 之 12.2 注解实现Bean依赖注入 ——跟我学spring3 12.2 注解实现Bean依赖注入 12.2.1 概述 注解实现Bean配置主要用来进行如依赖注入、生命周期回调方法定义等&#xff0c;不能消除XML文件中的Bean元数据定义&#xff0c;且基于XML配置中的依赖…

CLR运行时细节 - 继承多态的实现

关于多态不多解释了,在运行时决定和调用具体的实现,是面向对象的基础 设计模式的基础.准备把继承多态和接口多态分开,因为从CLR实现的角度继承多态相比于接口多态要简单得多,也更容易理解,本篇只讨论继承多态, .NET Framework 2.0 和 4.0 这两个版本在实现上稍微有点区别(这里先…

2015蓝桥杯省赛---java---B---8(饮料换购)

题目 饮料换购 饮料换购乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料&#xff0c;凭3个瓶盖可以再换一瓶C型饮料&#xff0c;并且可以一直循环下去&#xff0c;但不允许赊账。请你计算一下&#xff0c;如果小明不浪费瓶盖&#xff0c;尽量地参加活动&#xff0c;那么…

python123测验9程序题_python程序设计实验二

Python程序设计实验安徽工程大学班级&#xff1a;物流191 姓名&#xff1a;许岚岚 学号&#xff1a;3190505110日期&#xff1a;2020年3月21日指导教师&#xff1a;修 宇实验二 顺序结构程序设计(验证性实验)(二学时)【实验目的】(1)掌握数据的输入输出的方法&#…

零配置 之Spring基于Java类定义Bean配置元数据

转载自 【第十二章】零配置 之 12.4 基于Java类定义Bean配置元数据 ——跟我学spring3 12.4 基于Java类定义Bean配置元数据 12.4.1 概述 基于Java类定义Bean配置元数据&#xff0c;其实就是通过Java类定义Spring配置元数据&#xff0c;且直接消除XML配置文件。 基于Jav…

Rider IDE恢复了对.NET Core调试的支持

近期发布的JetBrain的Rider IDE&#xff08;EAP17&#xff09;移除了对.NET Core调试支持。该功能与NuGet的一个软件包在许可上存在冲突&#xff0c;而EAP17使用NuGet提供的.NET Core项目调试功能&#xff0c;所以必须要移除该功能。为此&#xff0c;JetBrains迅速推出了Rider …