图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,一经查实,立即删除!

相关文章

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. …

车载数据中心方案

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

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

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

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

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

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

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

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

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

Chrome和chromedriver版本不匹配导致的UI自动化测试无法运行的问题

今天&#xff0c;遇到一个小问题&#xff0c;本来跑的好好UI自动化测试脚本突然不好使了&#xff0c;期初怀疑是页面元素有调整导致脚本出现异常无法正常执行&#xff0c;经排查后发现近期页面没有任何调整。 这下头大了&#xff0c;啥也没改&#xff0c;怎么好好的脚本不能跑…

Vue3鼠标拖拽生成区域块并选中元素

Vue3鼠标拖拽生成区域块并选中元素&#xff0c;选中的元素则背景高亮(或者其它逻辑)。 <script setup> import { ref } from vue// 区域ref const regionRef ref(null)// 内容ref const itemRefs ref(null)// 是否开启绘画区域 const enable ref(false)// 鼠标开始位置…

LVS+keepalived——高可用集群

lvskeepalived&#xff1a;高可用集群 keepalived为lvs应运而生的高可用服务。lvs的调度器无法做高可用&#xff0c;于是keepalived这个软件。实现的是调度器的高可用。但是&#xff1a;keepalived不是专门为lvs集群服务的&#xff0c;也可以做其他代理服务器的高可用。 lvs的…

基于SSM的进销存管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Vue typescript项目配置eslint+prettier

1.安装依赖 安装 eslint yarn add eslint --dev安装 eslint-plugin-vue yarn add eslint-plugin-vue --dev主要用于检查 Vue 文件语法 安装 prettier 及相关插件 yarn add prettier eslint-config-prettier eslint-plugin-prettier --dev安装 typescript 解析器、规则补充 …

Spring-IOC-@Import的用法

1、Car.java package com.atguigu.ioc; import lombok.Data; Data public class Car {private String cname; }2、 MySpringConfiguration2.java package com.atguigu.ioc; import org.springframework.context.annotation.Bean; import org.springframework.context.annotatio…

树莓派的的串口通信协议

首先&#xff0c;回顾一下串口的核心知识点&#xff0c;也是面试重点&#xff1a; 串口通信通常使用在多机通讯中串口通信是全双工的决定串口通信的成功与否的是 数据格式 和 波特率数据格式&#xff1a;1. 数据位 2.停止位 3. 奇偶校验位 树莓派恢复串口 回忆前几节树莓派刷机…