图Graph的存储、图的广度优先搜索和深度优先搜索(待更新)

目录

一、图的两种存储方式

1.邻接矩阵

2.邻接表


生活中处处有图Graph的影子,例如交通图,地图,电路图等,形象的表示点与点之间的联系。

首先简单介绍一下图的概念和类型:

 

图的的定义:图是由一组顶点和一组能够将两个顶点相连的边组成的

图的类型:

顶点之间的连接方向:无方向-->无向图  有方向-->有向图 

边上是否有权值:有-->带权图  无-->无权图

以下分别是:无向无权、有向无权、无向有权、有向有权图

 

 

一、图的两种存储方式

1.邻接矩阵

存储原理:邻接矩阵是一种用数组来表示图的方法,其中矩阵的行和列表示图中的顶点,矩阵元素表示顶点之间是否有边相连。具体来说,如果顶点v和顶点u之间有边,则矩阵的第u行第v列的元素为1;否则为0。带权值则为权值,没有相连的为0。

优点:

  • 结构简单,易于理解和实现。

  • 对于稠密图,邻接矩阵的空间利用率较高。

  • 可以方便地计算出图中节点的度(即与该节点相邻的节点的数量)。

缺点:

  • 对于稀疏图,邻接矩阵可能占用大量空间。

  • 访问相邻节点的速度较慢,需要进行遍历操作。

示例:下图的邻接矩阵存储

 

代码实现 

import java.util.Arrays;//邻接矩阵
public class Graph01 {char[] val;//顶点数据int[][] edges;//二维数组记录边Vertex[] vertices;//顶点类数组int N;//表大小public Graph01(char[] arr) {this.N = arr.length;//初始化顶点数据this.val = Arrays.copyOf(arr, arr.length);this.edges = new int[this.N][this.N];this.vertices = new Vertex[this.N];for (int i = 0; i < this.N; i++) {this.vertices[i] = new Vertex(arr[i]);}}private class Vertex {Character val;public Vertex(Character val) {this.val = val;}}//打印邻接矩阵public void show() {System.out.format("%5c", 32);for (int i = 0; i < this.N; i++) {System.out.format("%5c", this.val[i]);}System.out.println();for (int i = 0; i < this.N; i++) {System.out.format("%5c", this.val[i]);for (int j = 0; j < this.N; j++) {System.out.format("%5d", this.edges[i][j]);}System.out.println();}}public static void main(String[] args) {char[] arr = {'A', 'E', 'F', 'G', 'H', 'P'};Graph01 graph01 = new Graph01(arr);// 构建边集int[][] edges = graph01.edges;edges[0][1] = 5;edges[0][2] = 4;edges[0][3] = 2;edges[1][0] = 5;edges[1][3] = 1;edges[1][4] = 3;edges[2][0] = 4;edges[3][0] = 2;edges[3][1] = 1;edges[3][4] = 2;edges[3][5] = 4;edges[4][1] = 3;edges[4][3] = 2;edges[4][5] = 3;edges[5][3] = 4;edges[5][4] = 3;// 调用打印方法graph01.show();}
}

打印结果 : 

 

2.邻接表

存储原理:

邻接表中的每个节点都对应一个链表,链表中的每个元素都是一个顶点(或节点),表示与当前节点相邻的节点。这种方式在处理稀疏图(即边的数量远小于顶点的数量)时效率较高。

优点:

  • 存储空间开销较小,适用于稀疏图。

  • 查找速度快,可以直接通过索引访问相邻节点。

  • 可动态添加、删除节点和边。

缺点:

  • 存储结构相对复杂,不利于处理大规模数据。

  • 空间利用率不高,对于稠密图可能存在大量未使用的节点和边。

代码实现 

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;//邻接表
public class Graph02 {char[] val;//顶点数据List<Integer>[] edgesList;//边连接Vertex[] vertices;int N;//表大小public Graph02(char[] arr){this.N = arr.length;this.val = Arrays.copyOf(arr,arr.length);this.edgesList = new List[this.N];this.vertices = new Vertex[this.N];for (int i = 0; i < this.N; i++) {this.vertices[i] = new Vertex(arr[i]);this.edgesList[i] = new ArrayList<>();}}private class Vertex{Character val;public Vertex(Character val){this.val = val;}}public void show(){//打印邻接矩阵for (int i = 0; i <this.N; i++) {System.out.format("%-3c",this.val[i]);List<Integer> list = this.edgesList[i];list.stream().forEach(item->{System.out.format("%d-->",item);});System.out.println();}}public static void main(String[] args) {char[] arr = {'A', 'E', 'F', 'G', 'H', 'P'};Graph02 graph02 = new Graph02(arr);// 构建边集List<Integer>[] edges = graph02.edgesList;edges[0].add(1);edges[0].add(2);edges[0].add(3);edges[1].add(0);edges[1].add(3);edges[1].add(4);edges[2].add(0);edges[3].add(0);edges[3].add(1);edges[3].add(4);edges[3].add(5);edges[4].add(1);edges[4].add(3);edges[4].add(5);edges[5].add(3);edges[5].add(4);// 调用打印方法graph02.show();}
}

打印结果 :

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

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

相关文章

高防CDN:保障网络安全的未来之路

在当前数字化飞速发展的时代&#xff0c;网络安全问题日益成为企业和个人关注的焦点。高防CDN&#xff08;Content Delivery Network&#xff0c;内容分发网络&#xff09;作为一种专注于防御网络攻击的解决方案&#xff0c;尽管在技术上表现卓越&#xff0c;但其普及却面临一系…

Qt 基于海康相机的视频绘图

需求 在视频窗口上进行绘图&#xff0c;包括圆&#xff0c;矩形&#xff0c;扇形等 效果&#xff1a; 思路&#xff1a; 自己取图然后转成QImage &#xff0c;再向QWidget 进行渲染&#xff0c;根据以往的经验&#xff0c;无法达到很高的帧率。因此决定使用相机SDK自带的渲染…

机器视觉系统选型-环形光源分类及应用场景

环形光源主要分为&#xff1f; 1.环形光源(高角度) 照射光线与水平方向成高角度夹角 外观缺陷检测字符识别PCB基板检测二维码读取- 2.环形光源(低角度) 照射光线与水平方向成低角度夹角各种边缘提取字符识别玻璃断面的损伤检测金属表面刻印、损伤 3.环形光源(高亮) 高亮度远…

谈谈你对mvc和mvvm的理解

MVC和MVVM是软件开发中两种常见的架构模式&#xff0c;各自有不同的优缺点。 MVC&#xff08;Model-View-Controller&#xff09;是一种经典的架构模式&#xff0c;将应用程序分为三个部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和…

从暗黑3D火炬之光技能系统说到-Laya非入门教学一~资源管理

我不知道那些喷Laya没有浏览器&#xff0c;嘲笑别人编辑器做不好&#xff0c;是什么水平&#xff1f; 首先目前国内除了WPS和飞书&#xff0c;就没有第三家公司能把编辑器做好。 要是一般的游戏开发者&#xff0c;如我&#xff0c;有一点点引擎代码&#xff08;某项目&#x…

opencv-图像对比度增强

对比度增强&#xff0c;即将图片的灰度范围拉宽&#xff0c;如图片灰度分布范围在[50,150]之间&#xff0c;将其范围拉升到[0,256]之间。这里介绍下 线性变换&#xff0c;直方图正规化&#xff0c;伽马变换&#xff0c;全局直方图均衡化&#xff0c;限制对比度自适应直方图均衡…

django+drf+vue 简单系统搭建 (4) 用户权限

权限控制是web中的重要组成部分。与以往的博客系统不同&#xff0c;本次工具页面仅支持注册用户。 每个注册用户都能访问到工具页面&#xff0c;并且提交自己的task来选择具体的工具来处理自己提交的文件。每个注册用户都只能访问到自己提交的task&#xff0c;而管理员则可以查…

SAP 调取http的x-www-form-urlencoded形式的接口

一、了解下x-www-form-urlencoded形式对于SAP来说有啥区别 简单来说&#xff0c; 1.raw格式就是标准的json格式&#xff1a;{“Name”:“John Smith”&#xff0c;“Age”: 23} 2.x-www格式是要转化一下的&#xff1a;NameJohnSmith&Age23 字段与字段相互连接要用 & 符…

pycharm 控制台中文乱码处理

今天使用pycharm&#xff0c;发现控制台输出又中文乱码了&#xff0c;看网上很多资料说把编码改为UTF-8&#xff0c;设置为并未生效&#xff0c;特此在此记录下本地设置。 1. 修改文件编码&#xff1a;Setting -> Editor ->File Encodings,修改配置如下&#xff1a; 2. …

Golang http 请求如何设置代理

ENV golang 1.17 使用代理 需要在创建 http client 的时候设置&#xff0c;使 http 库能够捕获环境变量 示例 func newClient(cert tls.Certificate) (*http.Client, error) {config : &tls.Config{Certificates: []tls.Certificate{cert},}config.BuildNameToCertific…

车载数据中心方案

下面这张图是小鹏汽车嵌入式系统高级专家 唐黾 在同ARM一起的一个演讲稿中发布的&#xff0c;是一张未来车载数据中心单芯片方案构想图。主要针对的是智驾域和座舱域融合方案&#xff0c;下面对如上图的内外部组件及接口一一描述。 DMS: Driver Monitoring System&#xff0c;监…

02-微服务的拆分规则和基于RestTemplate的远程调用

微服务的拆分与远程调用 创建父工程 任何分布式架构都离不开服务的拆分, 微服务也是一样 , 微服务的拆分遵守三个原则 微服务需要根据业务模块拆分,不同微服务不要重复开发相同业务每个微服务都有自己独立的数据库, 不要直接访问其他微服务的数据库微服务可以将自己的业务暴…

UDP接收报文函数recvfrom和UDP发送报文函数sendto

#include <sys/socket.h> ssize_t recvfrom(int sockfd, void *buff, size_t nbytes, int flags, struct sockaddr *from, socklen_t *addrlen); sockfd、buff 和 nbytes 是前三个参数。sockfd 是本地创建的套接字描述符&#xff0c;buff 指向本地的缓存&#xff0c;nbyt…

【网络安全】-网络安全的分类详解

文章目录 介绍1. 网络层安全&#xff08;Network Layer Security&#xff09;理论实操使用VPN保护隐私 2. 应用层安全&#xff08;Application Layer Security&#xff09;理论实操使用密码管理器 3. 端点安全&#xff08;Endpoint Security&#xff09;理论实操定期更新防病毒…

C#流Stream与IO详解(5)——读取文件的详细流程

【前言】 这里说的是阻塞式读写文件&#xff0c;只说主要的流程&#xff0c;不包括每个流程中为了处理不同情况的更细节处理 【读取文件】 应用程序中&#xff08;用户层&#xff09; C#调用FileStream.Read相关接口&#xff0c;传递文件句柄FileHandle&#xff0c;要读取的…

数据分析:数据预处理流程及方法

数据预处理是数据分析过程中至关重要的一步&#xff0c;它涉及到清洗、转换和整理原始数据&#xff0c;以便更好地适应分析模型或算法。以下是一些常见的数据预处理方法和规则&#xff1a; 数据清洗&#xff1a; 处理缺失值&#xff1a;检测并处理数据中的缺失值&#xff0c;可…

武汉凯迪正大—盐雾试验机

产品概述 武汉凯迪正大KDYD-YW盐雾试验箱乃针对各种材质表面处理&#xff0c;包含涂料、电镀、有机及无机皮膜&#xff0c;阳极处理&#xff0c;防锈油等防腐处理后测试其耐腐蚀性&#xff0c;从而确立产品的质量。 产品特点 1、结构紧凑&#xff0c;体积小、携带方便&#…

.NET中的Object类学习3_MemberwiseClone方法

文章目录 一、前言二、Object.MemberwiseClone方法1 定义2 示例3 备注 三、总结 一、前言 按照MSDN文档的章节顺序来&#xff0c;本文应该是第五节。 但是学了上一节 Finalize之后&#xff0c;发现其内容对实际开发帮助不大。 所以这次跳过了前面的GetHashCode、GetType章节&a…

艺术作品3D虚拟云展厅能让客户远程身临其境地欣赏美

艺术品由于货物昂贵、易碎且保存难度大&#xff0c;因此在艺术品售卖中极易受时空限制&#xff0c;艺术品三维云展平台在线制作是基于web端将艺术品的图文、模型及视频等资料进行上传搭配&#xff0c;构建一个线上艺术品3D虚拟展厅&#xff0c;为艺术家和观众提供了全新的展示和…

opencv-python 印刷质量缺陷的视觉检测

Windows10PythonYolov8ONNX图片缺陷识别&#xff0c;并在原图中标记缺陷&#xff0c;有onnx模型则无需配置&#xff0c;无需训练。 ** PythonYolov8ONNX实时缺陷目标检测原文 labelimg使用指南 windows使用YOLOv8训练自己的模型&#xff08;0基础保姆级教学&#xff09; pyth…