图的深度优先遍历和广度优先遍历

目录

图的创建和常用方法

深度优先遍历(Depth First Search)

广度优先遍历(Broad First Search) 


图的创建和常用方法

//无向图
public class Graph {//顶点集合private ArrayList<String> vertexList;//存储对应的邻接矩阵private int[][] edges;//边数private int numOfEdges;//构造方法//传入顶点数public Graph(int numOfVertex) {this.vertexList = new ArrayList<>(numOfVertex);this.edges = new int[numOfVertex][numOfVertex];this.numOfEdges = 0;//边数初始为0}//添加顶点public void  interVertex(String vertex){vertexList.add(vertex);}//添加边public void interEdge(int v1,int v2,int weight){edges[v1][v2] = weight;edges[v2][v1] = weight;numOfEdges++;}//图中常用方法://返回节点的个数public int getNumOfVertex(){return vertexList.size();}//得到边的数目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 showGraph(){for(int[] link:edges){System.out.println(Arrays.toString(link));}}//测试public static void main(String[] args) {int n = 5;String[] vertexs={"A","B","C","D","E"};Graph graph = new Graph(n);//添加顶点for(String vertex:vertexs){graph.interVertex(vertex);}//添加边:A-C  A-B  A-E  B-Dgraph.interEdge(0,2,1);graph.interEdge(0,1,1);graph.interEdge(0,4,1);graph.interEdge(1,3,1);graph.showGraph();}
}

邻接矩阵: 

 

 

 

深度优先遍历(Depth First Search)

深度优先:每次访问当前节点后,首先访问当前节点的第一个邻接矩阵

添加标记顶点是否访问的数组:

 private boolean[] isVisted;

 在构造方法中初始化:

  this.isVisted = new boolean[numOfVertex];

得到第一个邻接节点的下标w: 

 //得到第一个邻接节点的下标wpublic 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;}

深度优先遍历: 

 //深度优先遍历private void dfs(boolean[] isVisted,int i){//首先访该节点,输出System.out.print(getValueByIndex(i)+"->");//访问标记isVisted[i] = true;//访问节点的第一个邻接节点int w = getFirstNeighbor(i);while (w!=-1){//有的话并且没有被访问过,就遍历该节点if (!isVisted[w]){dfs(isVisted,w);}//如果已经被访问过,就访问下一个w = getNextNeighbor(i,w);}}

 若是非连通图(有孤立点),需要将每个顶点深度遍历:

//若是非连通图,需要将每个顶点深度遍历public void dfs(){for (int i = 0; i < vertexList.size(); i++) {if (!isVisted[i]){dfs(isVisted,i);}}}

 如下图的深度遍历:

 

 //测试public static void main(String[] args) {int n = 6;String[] vertexs={"A","B","C","D","E","F"};Graph graph = new Graph(n);//添加顶点for(String vertex:vertexs){graph.interVertex(vertex);}//添加边:A-C  A-B  A-E  B-Dgraph.interEdge(0,2,1);graph.interEdge(0,1,1);graph.interEdge(0,4,1);graph.interEdge(1,3,1);graph.showGraph();graph.dfs();}

广度优先遍历(Broad First Search) 

 广度优先:先访问所有直接相邻的节点,然后访问所有与这些节点相邻的节点,以此类推,直到遍历完整个图。

//广度优先遍历//对一个节点进行广度优先算法private void bfs(boolean[] isVisted,int i){int u;//队列头结点的下标int w;//邻接节点LinkedList queue = new LinkedList();//  访问节点,输出System.out.print (getValueByIndex(i)+"=>");//    标记已访问isVisted[i]=true;//    添加到队列queue.addLast(i);while (!queue.isEmpty()){u = (Integer) queue.removeFirst();//得到第一个邻接节点的下标w = getFirstNeighbor(u);while (w!=-1){if (!isVisted[w]){//没有访问过System.out.print(getValueByIndex(w)+"=>");isVisted[w] = true;queue.addLast(w);}//以u为前一个节点,访问过去下一个节点w = getNextNeighbor(u, w);}}}//非连通图 广度优先遍历public void bfs(){this.isVisted = new boolean[vertexList.size()];for (int i = 0; i < vertexList.size(); i++) {if (!isVisted[i]){bfs(isVisted,i);}}}

测试:

System.out.println("广度优先");
graph.bfs();

 深度和广度测试:

public static void main(String[] args) {int n = 8;String[] vertexs={"1","2","3","4","5","6","7","8"};Graph graph = new Graph(n);//添加顶点for(String vertex:vertexs){graph.interVertex(vertex);}//添加边:1-2 1-3 2-4 2-5 4-8 5-8 3-6 3-7graph.interEdge(0,1,1);graph.interEdge(0,2,1);graph.interEdge(1,3,1);graph.interEdge(1,4,1);graph.interEdge(3,7,1);graph.interEdge(4,7,1);graph.interEdge(2,5,1);graph.interEdge(2,6,1);graph.showGraph();System.out.println("深度优先");graph.dfs();System.out.println();System.out.println("广度优先");graph.bfs();}

 

 

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

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

相关文章

JVM工作的总体机制概述

JDK、JRE、JVM关系回顾 JVM&#xff1a;Java Virtual Machine&#xff0c;翻译过来是Java虚拟机JRE&#xff1a;Java Runtime Environment&#xff0c;翻译过来是Java运行时环境 JREJVMJava程序运行时所需要的类库JDK&#xff1a;Java Development Kits&#xff0c;翻译过来是…

进程 的初识

程序和进程有什么区别 程序是静态的概念&#xff0c;gcc xxx.c -o pro 磁盘中生成的文件&#xff0c;叫做程序。进程是程序的一次运行活动&#xff0c;通俗点的意思就是程序跑起来了&#xff0c;系统中就多了一个进程。 如何查看系统中有哪些进程 使用 ps 指令&#xff08;完整…

解决vue3+echarts关于无法获取dom宽度和高度的问题

解决vue3echarts关于无法获取dom宽度和高度的问题 近期写vue3项目&#xff0c;很多地方都用到了echarts&#xff0c;刚开始写的时候&#xff0c;发现图一直出不来&#xff0c;报错/报警内容一般有两项&#xff1a; Uncaught (in promise) Error: Initialize failed: invalid …

恒盛策略:欧洲能源危机又来?天然气价格飙升,受益板块曝光

储能板块有望获益。 今日早盘煤炭、交通运输、石油石化等板块涨幅均超1%&#xff0c;其中煤炭板块涨1.37%位居第一位。音讯面上&#xff0c;欧佩克重申减产战略&#xff0c;世界原油价格升至3个月来高位。此外&#xff0c;隔夜欧洲天然气期货跳涨40%&#xff0c;创2022年3月以来…

7.6 通俗易懂解读残差网络ResNet 手撕ResNet

一.举例通俗解释ResNet思想 假设你正在学习如何骑自行车&#xff0c;并且想要骑到一个遥远的目的地。你可以选择直接骑到目的地&#xff0c;也可以选择在途中设置几个“中转站”&#xff0c;每个中转站都会告诉你如何朝着目的地前进。 在传统的神经网络中&#xff0c;就好比只…

如何设置文字颜色和背景颜色?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 设置文字颜色&#xff08;color属性&#xff09;⭐ 设置背景颜色&#xff08;background-color属性&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你…

关于丢失安卓秘钥的撞sha-1值的办法

实验得知&#xff0c;安卓sha-1和keytool生成秘钥签名文件的时间有关。 前提条件是&#xff0c;开发者必须知道生成秘钥的所有细节参数 以下是撞文件代码&#xff08;重复生成&#xff09; import time import osidx 0while True:cmdkeytool -keyalg RSA -genkeypair -alia…

机器学习实战2决策树算法

文章目录 决策树算法核心是要解决两个的关键问题sklearn中的决策树模型sklearn建模步骤分类树Criterionrandom_state && splitter剪枝参数max_depthmin_samples_leaf&&min_samples_splitmax_features&&min_impurity_decrease确认最优剪枝参数目标权重参…

【LangChain学习】基于PDF文档构建问答知识库(三)实战整合 LangChain、OpenAI、FAISS等

接下来&#xff0c;我们开始在web框架上整合 LangChain、OpenAI、FAISS等。 一、PDF库 因为项目是基于PDF文档的&#xff0c;所以需要一些操作PDF的库&#xff0c;我们这边使用的是PyPDF2 from PyPDF2 import PdfReader# 获取pdf文件内容 def get_pdf_text(pdf):text "…

建材陶瓷片机器视觉定位软硬件方案

【检测目的】 建材陶瓷片机器视觉定位 【检测要求】 精度0.02mm 产品大小&#xff1a;60mm—70mm 颜色为&#xff1a;白、绿两种 5S图像处理时间 【拍摄效果图一】 上料位 【拍摄效果图二】 上料位 【拍摄效果图三】 上料位 【拍摄效果图四】 上料位 【硬件配置】 外框 …

C++初阶——函数重载

前言&#xff1a;C中除了可以在不同的命名空间中使用同名函数&#xff0c;还有一种支持在同一个作用域中同名函数的方式——函数重载。 函数重载 一.什么是函数重载&#xff1f;二.函数重载的3种规则三.特殊情况 一.什么是函数重载&#xff1f; C允许同样同一作用域中声明几个功…

爬虫ip池越大越好吗?

作为一名资深的程序员&#xff0c;今天我要给大家分享一些关于爬虫ip池的知识。关于ip代理池的问题&#xff0c;答案是肯定的&#xff0c;池子越大越好。下面跟我一起来盘点一下ip池大的好处吧&#xff01; 1、提高稳定性 爬虫ip池越大&#xff0c;意味着拥有更多可用的爬虫ip…

HCIA---路由器--静态路由

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 一.路由器简介 二.路由器转发原理 三.骨干链路 四.路由分类 五.静态路由 总结 一.路由器简介 路由器是一种网络设备&#xff0c;用于将数据包从一个网络发送…

【Linux】UDP协议——传输层

目录 传输层 再谈端口号 端口号范围划分 认识知名端口号 两个问题 netstat与iostat pidof UDP协议 UDP协议格式 UDP协议的特点 面向数据报 UDP的缓冲区 UDP使用注意事项 基于UDP的应用层协议 传输层 在学习HTTP等应用层协议时&#xff0c;为了便于理解&#xff…

git的简单介绍和使用

git学习 1. 概念git和svn的区别和优势1.1 区别1.2 git优势 2. git的三个状态和三个阶段2.1 三个状态&#xff1a;2.2 三个阶段&#xff1a; 3. 常用的git命令3.1 下面是最常用的命令3.2 git命令操作流程图如下&#xff1a; 4. 分支内容学习4.1 项目远程仓库4.2 项目本地仓库4.3…

线上电影购票选座H5小程序源码开发

搭建一个线上电影购票选座H5小程序源码需要一些基本的技术和步骤。以下是一个大致的搭建过程&#xff0c;可以参考&#xff1a; 1. 确定需求和功能&#xff1a;首先要明确你想要的电影购票选座H5小程序的需求和功能&#xff0c;例如用户登录注册、电影列表展示、选座购票、订单…

编程中的宝藏:二分查找

二分查找 假设你需要在电话簿中找到一个以字母 “K” 开头的名字&#xff08;虽然现在谁还在用电话簿呢&#xff01;&#xff09;。你可以从头开始翻页&#xff0c;直到进入以 “K” 打头的部分。然而&#xff0c;更明智的方法是从中间开始&#xff0c;因为你知道以 “K” 打头…

Unity游戏源码分享-仿开心消消乐Match3Jewel

Unity游戏源码分享-仿开心消消乐Match3Jewel 工程地址&#xff1a; https://download.csdn.net/download/Highning0007/88198762

Oracle DB 安全性 : TDE HSM TCPS Wallet Imperva

• 配置口令文件以使用区分大小写的口令 • 对表空间进行加密 • 配置对网络服务的细粒度访问 TCPS 安全口令支持 Oracle Database 11g中的口令&#xff1a; • 区分大小写 • 包含更多的字符 • 使用更安全的散列算法 • 在散列算法中使用salt 用户名仍是Oracle 标识…

嵌入式开发:高薪与广阔前景

嵌入式开发是高薪且前景广阔的领域。随着物联网和智能化的快速发展&#xff0c;嵌入式开发人才需求不断增加&#xff0c;市场供应相对不足&#xff0c;导致竞争激烈&#xff0c;推动了薪资水平的提升。 嵌入式开发的复杂性和技术要求使得企业为了吸引优秀人才&#xff0c;普遍…