图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();
    }
}

打印结果 :

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

11.21序列检测,状态机比较与代码,按键消抖原理

序列检测 用一个atemp存储之前的所有状态&#xff0c;即之前出现的七位 含无关项检测 要检测011XXX110 对于暂时变量的高位&#xff0c;位数越高就是越早出现的数字&#xff0c;因为新的数字存储在TEMP的最低位 不重叠序列检测 &#xff0c;一组一组 011100 timescale 1ns…

合肥中科深谷嵌入式项目实战——基于ARM语音识别的智能家居系统(三)

基于ARM语音识别的智能家居系统 我们上一篇&#xff0c;我们实现在Linux系统下编译程序&#xff0c;我们首先通过两个小练习来熟悉一下如何去编译。今天&#xff0c;我们来介绍一下LCD屏幕基本使用。 一、LCD屏幕基本使用 如何使用LCD屏幕&#xff1f; 1、打开开发板LCD设…

JSP编写自己的第一个WebServlet实现客户端与服务端交互

我们在项目中找到java目录 下面有一个包路径 然后 我们在下面创建一个类 我这里叫 TransmissionTest 当然 名字是顺便取的 参考代码如下 package com.example.dom;import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet…

【精选】OpenCV多视角摄像头融合的目标检测系统:全面部署指南&源代码

1.研究背景与意义 随着计算机视觉和图像处理技术的快速发展&#xff0c;人们对于多摄像头拼接行人检测系统的需求日益增加。这种系统可以利用多个摄像头的视角&#xff0c;实时监测和跟踪行人的活动&#xff0c;为公共安全、交通管理、视频监控等领域提供重要的支持和帮助。 …

宏集新闻 | 虹科传感器事业部正式更名为宏集科技

致一直支持“虹科传感器”的朋友们&#xff1a; 为进一步整合资源&#xff0c;给您带来更全面、更优质的服务&#xff0c;我们非常荣幸地宣布&#xff0c;虹科传感器事业部已正式更名为宏集科技。这一重要的改变代表了虹科持续发展进程中的新里程碑&#xff0c;也体现了我们在传…

【brpc学习实践四】异步请求案例详解

注意 使用的还是源码的案例&#xff0c;添加个人注解。在前面的篇章我们讲解了客户端、服务端rpc构造的基本流程及同步、异步的案例基础之后&#xff0c;再理解此案例就容易了。 想直接看案例实现请看&#xff1a; server端实现 client端实现 服务端要点概览 controller ser…

同为科技(TOWE)智能机柜PDU助力上海华为数据中心完善机房末端配电

智能时代加速而来&#xff0c;最大的需求是算力&#xff0c;最关键的基础设施是数据中心。作为一家在信息通信领域拥有多年经验和技术积累的公司&#xff0c;华为在全国多个地区都设有数据中心&#xff0c;如知名的贵州贵安华为云全球总部、内蒙古乌兰察布华为数据中心等&#…

git -1

1.创建第一个仓库并配置local用户信息 git config git config --global 对当前用户所有仓库有效 git config --system 对系统所有登录的用户有效 git config --local 只对某个仓库有效 git config --list 显示配置 git config --list --global 所有仓库 git config --list…

机器视觉兄弟们,新工作之前,不要过度准备

大家对工作的渴望我感同身受&#xff0c;有人去机器视觉培训机构培训&#xff0c;有人默默无闻地努力学习&#xff0c;不都是为了一份高新好工作吗&#xff1f; 实际上是&#xff1a; 技术高的人&#xff0c;劳动力贬值。 技术低的人&#xff0c;没有生存空间。 你有野心&…

HarmonyOS从基础到实战-高性能华为在线答题元服务

最近看到美团、新浪、去哪儿多家互联网企业启动鸿蒙原生应用开发&#xff0c;这个HarmonyOS NEXT越来越引人关注。奈何当前不面向个人开发者开放&#xff0c;但是我们可以尝试下鸿蒙新的应用形态——元服务的开发。 元服务是基于HarmonyOS提供的一种面向未来的服务提供方式&…

『亚马逊云科技产品测评』活动征文|搭建Squoosh图片在线压缩工具

搭建Squoosh图片在线压缩工具 前言一、Squoosh是什么&#xff1f;二、准备一台Lightsail实例1.进入控制台2.创建实例3.开放端口4.部署Squoosh5.预览 三、搭建反向代理1. 安装宝塔2. 配置反向代理3. 预览代理效果 提示&#xff1a;授权声明&#xff1a;本篇文章授权活动官方亚马…

Spark---核心介绍

一、Spark核心 1、RDD 1&#xff09;、概念&#xff1a; RDD&#xff08;Resilient Distributed Datest&#xff09;&#xff0c;弹性分布式数据集。 2&#xff09;、RDD的五大特性&#xff1a; 1、RDD是由一系列的partition组成的 2、函数是作用在每一个partition(split…

JVM的垃圾收集算法

1.算法的分类 1.1标记清除算法 第一步&#xff1a;标记&#xff08;找出内存中需要回收的对象&#xff0c;并且把它们标记出来&#xff09; 根据可达性算法&#xff0c;标记的是存活的对象&#xff0c;然后将其他的空间进行回收 第二步&#xff1a;清除&#xff08;清除掉被…

气相色谱质谱仪样品传输装置中电动针阀和微泄漏阀的解决方案

标题 摘要&#xff1a;针对目前国内外各种质谱仪压差法进样装置无法准确控制进气流量&#xff0c;且无相应配套产品的问题&#xff0c;本文提出了相应的解决方案和配套部件。解决方案主要解决了制作更小流量毛细管和毛细管进气端真空压力精密控制问题&#xff0c;微流量毛细管的…

Qt TCP相关的一些整理:服务端常见操作 socket 通信 network

目录 前言&#xff1a; 1、相关的库和类 2、服务端常用API 核心代码呈上&#xff1a; 前言&#xff1a; 在Qt的服务端上&#xff0c;不单单会用到服务端本身的API&#xff0c;对连接上来的客户端&#xff0c;也需要进行数据交互&#xff0c;也要用到一些收发包相关的…

Linux(5):Linux 磁盘与文件管理系统

认识 Linux 文件系统 磁盘的物理组成&#xff1a; 1.圆形的磁盘盘(主要记录数据的部分); 2.机械手臂&#xff0c;与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据)&#xff1b; 3.主轴马达&#xff0c;可以转动磁盘盘&#xff0c;让机械手臂的读取头在磁盘盘上读写数据。 4…

runnergo全栈测试平台

一、全栈测试平台runnergo使用 官网 官方使用文档 二、单接口测试 三、性能测试 1.性能测试 2.性能测试报告 四、自动化测试&#xff08;暂时不支持UI自动化&#xff0c;或许会上&#xff09;

数据结构与算法编程题6

将两个有序顺序表合并成一个新的有序表&#xff0c;并有函数返回有序顺序表 #include <iostream> using namespace std;typedef int ElemType; #define Maxsize 100 #define OK 1 #define ERROR 0 typedef struct SqList {ElemType data[Maxsize];int length; }SqList;…

ck 配置 clickhouse-jdbc-bridge

背景 ck可以用过clickhouse-jdbc-bridge技术来直接访问各数据库 安装配置 需要准备的文件 clickhouse-jdbc-bridge https://github.com/ClickHouse/clickhouse-jdbc-bridge 理论上需要下载源码然后用mavne打包&#xff0c;但提供了打包好的&#xff0c;可以推测用的是mave…

leetcode:20. 有效的括号

一、题目&#xff1a; 链接&#xff1a;20. 有效的括号 - 力扣&#xff08;LeetCode&#xff09; 函数原型&#xff1a;bool isValid(char* s) 二、思路&#xff1a; 利用栈来解这道题会方便许多&#xff1a; 遍历字符串s&#xff0c;当遇到左括号就将其压入栈中&#xff1b;遇…