【基础知识整理】图的基本概念 邻接矩阵 邻接表

news2024/10/6 2:23:19

一、图概述

定义:

图(graph)是由一些点(vertex)和这些点之间的连线(edge)所组成的;
其中,点通常被成为"顶点(vertex)“,而点与点之间的连线则被成为"边或弧”(edege)。
通常记为,G=(V,E)。

图是一种重要的数据结构,基本概念包括:顶点,边,有向,无向,权,路径回路,连通域,邻接点,度,入边,出边,入度,出度等等,很好理解。

参考这篇博客:http://www.cnblogs.com/skywang12345/p/3691463.html

二、图基础

2 图的分类

根据边是否有方向,将图可以划分为:无向图有向图

2.1.1 无向图

即两个顶点之间没有明确的指向关系,只有一条边相连,例如,A顶点和B顶点之间可以表示为 <A, B> 也可以表示为<B, A>,如下所示

在这里插入图片描述

上面的图G0是无向图,无向图的所有的边都是不区分方向的。

我们用 **图 = (顶点集合,{边集合})**来表示图。

G0=(V1,{E1}) 其中,

(01) V1={A,B,C,D,E,F}。 V1表示由"A,B,C,D,E,F"几个顶点组成的集合。

(02) E1={(A,B),(A,C),(B,C),(B,E),(B,F),(C,F), (C,D),(E,F),(C,E)}。 E1是由边(A,B),边(A,C)…等等组成的集合。其中,(A,C)表示由顶点A和顶点C连接成的边。

2.2.2 有向图

顶点之间是有方向性的,例如A和B顶点之间,A指向了B,B也指向了A,两者是不同的,如果给边赋予权重,那么这种异同便更加显著了
在这里插入图片描述

上面的图G2是有向图。

和无向图不同,有向图的所有的边都是有方向的!  

3、邻接点和度

3.1 邻接点

一条边上的两个顶点叫做邻接点
例如,上面无向图G0中的顶点A和顶点C就是邻接点。

在有向图中,除了邻接点之外;还有"入边"和"出边"的概念。
顶点的入边,是指以该顶点为终点的边。而顶点的出边,则是指以该顶点为起点的边。

例如,上面有向图G2中的B和E是邻接点;<B,E>是B的出边,还是E的入边。

3.2 度

在无向图中,某个顶点的度是邻接到该顶点的边(或弧)的数目
例如,上面无向图G0中顶点A的度是2。

在有向图中,度还有"入度"和"出度"之分。
某个顶点的入度,是指以该顶点为终点的边的数目。
而顶点的出度,则是指以该顶点为起点的边的数目。顶点的度=入度+出度。

例如,上面有向图G2中,顶点B的入度是2,出度是3;顶点B的度=2+3=5。

4、路径和回路

路径:如果顶点(Vm)到顶点(Vn)之间存在一个顶点序列。则表示Vm到Vn是一条路径。
路径长度:路径中"边的数量"。
简单路径:若一条路径上顶点不重复出现,则是简单路径。

回路:若路径的第一个顶点和最后一个顶点相同,则是回路。
简单回路:第一个顶点和最后一个顶点相同,其它各顶点都不重复的回路则是简单回路。

三、图的存储结构

上面了解了"图的基本概念",下面开始介绍图的存储结构。图的存储结构,常用的是"邻接矩阵"和"邻接表"。

3.1 邻接矩阵

邻接矩阵是指用矩阵来表示图。它是采用矩阵来描述图中顶点之间的关系(及弧或边的权)。假设图中顶点数为n,则邻接矩阵定义为:
在这里插入图片描述

下面通过示意图来进行解释。
在这里插入图片描述

图中的G1是无向图和它对应的邻接矩阵。
在这里插入图片描述

图中的G2是有向图和它对应的邻接矩阵。
通常采用两个数组来实现邻接矩阵:一个一维数组用来保存顶点信息,一个二维数组来用保存边的信息。
邻接矩阵的缺点就是比较耗费空间。

3.2 邻接表

邻接表是图的一种链式存储表示方法。它是改进后的"邻接矩阵",它的缺点是不方便判断两个顶点之间是否有边,但是相对邻接矩阵来说更省空间。
在这里插入图片描述
图中的G1是无向图和它对应的邻接矩阵。

在这里插入图片描述
图中的G2是无向图和它对应的邻接矩阵。

3.3 十字链表

对于邻接表来说,计算顶点的入度是不方便的,那么有没有一种存储方式能够轻松的计算顶点的入度和出度呢,在十字链表中重新定义了节点的结构:

3.4 使用

实际使用,我们在拓扑排序中,使用邻接矩阵来实现,这是i个二维数组

首先,定义一些属性,用来存放节点数、顶点名称、排序后的顺序,图关系矩阵


        /**
         * 节点个数
         */
        public int size;

        /**
         * 顶点名称
         */
        char [] nodeName;

        /**
         * 排序后的顺序
         */
        List result;

        /**
         * 图关系矩阵
         */
        int [][] matrix;

然后排序


        // 排序
        public void tuopuSort() {
            System.out.println("\n");
            // 一个一维数组,用来保存顶点的入度
            int indegree[] = new int[size];
            boolean indegreeV[] = new boolean[size];


            // 给入度输入值
            for(int i = 0; i < size; i ++) {
                indegreeV[i] = false;
                for (int j = 0; j < size; j ++) {
                    if (matrix[i][j] == 1) {
                        indegree[j] = indegree[j] + 1;
                    }
                }
            }
            System.out.println("\n");

            //开始进行遍历
            LinkedList<String> nodes = new LinkedList<String>();

            // 将入度为 0 的节点入队列
            for (int x = 0; x < size; x ++) {
                if (indegree[x] == 0) {
                    System.out.println(nodeName[x]);
                    nodes.add(String.valueOf(nodeName[x]));
                }
            }

            int j = 0;
            while (!nodes.isEmpty()) {
                for (int x = 0; x < size; x ++) {
                    System.out.println("\n 数组 x = " + x + ", ");
                    if (indegree[x] == 0 && !indegreeV[x]) {

                        indegreeV[x] = true;
                        String s = nodes.poll();
                        System.out.println("add = " +s);
                        result.add(s);

                        // 找到跟它相关的节点,,入度 -1
                        for (int y = 0; y < size; y ++) {
                            if (matrix[x][y] == 1) {
                                System.out.println("相关的节点 -1 = " + y);
                                indegree[y] = indegree[y] - 1;
                                if (indegree[y] == 0) {
                                    System.out.println("相关的节点 -1 后, 入度为0, " + nodeName[y]);
                                    nodes.add(String.valueOf(nodeName[y]));
                                }
                            }
                        }
                    } else {

                    }
                }
                j ++;
            }


            System.out.println(result);

        }

四、图的遍历

深度优先遍历(DFS) & 广度优先遍历(BFS)
详细请看另外一篇文章

参考文章
图的理论基础

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

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

相关文章

ANR中为什么会出现堆栈漂移

前言 我们排查ANR问题的时候&#xff0c;会发现有时候anr文件中捕获的堆栈信息&#xff0c;并不准确&#xff0c;而且经常会打印下面这样的堆栈&#xff1a; "main" prio5 tid1 Native| group"main" sCount1 ucsCount0 flags1 obj0x71ac6f78 self0xb4000…

java+mysql校园外卖订餐管理系统servlet

3.1 课题目的 对于客户而言&#xff0c;外卖订单管理系统最好是越方便操作&#xff0c;越简单越好。客户对于外卖订单系统&#xff0c;对他的首要要求就是能够安全&#xff0c;顺利的完成订单。但是很多时候开发人员更在意一些创新的模式&#xff0c;去增加用户的体验感或增值服…

关于变邻域搜索求解柔性作业车间问题的探讨

邻域结构交换内部关键块的操作 譬如&#xff0c;某案例的内部关键块为501—601—502—701&#xff0c;部分OS加工顺序码如下(标注的黄色底纹&#xff1a;为内部关键块) 在移动内部关键快操作时&#xff0c;请教各位是否是如下的变换&#xff1a; ① 块尾701 移至 块内工序50…

vs Git 本地服务器仓库配置

1、安装Git程序 Git 下载地址一https://git-scm.com/download/winGit 下载地址二We bring the awesome Git VCS to Windowshttps://gitforwindows.org/ 2、新建本地服务端仓库 2.1、新建文件夹&#xff0c;并创建仓库 在本地新建文件夹&#xff1a;//本地服务器仓库 在服务…

Vue+SpringBoot打造电子元器件管理系统(附源码文档)

作者主页&#xff1a;Designer 小郑 作者简介&#xff1a;Java全栈软件工程师一枚&#xff0c;来自浙江宁波&#xff0c;负责开发管理公司OA项目&#xff0c;专注软件前后端开发、系统定制、远程技术指导。CSDN学院、蓝桥云课认证讲师&#xff0c;全栈领域优质创作者。 一、摘要…

SSRS rdlc报表 七 安装及配置报表服务

开发环境 vs2022 sqlserver 2019 参考文档&#xff1a;安装 SQL Server Reporting Services - SQL Server Reporting Services (SSRS) | Microsoft Learn 配置 URL (Configuration Manager) - SQL Server Reporting Services (SSRS) | Microsoft Learn 如果你在安装数据库的…

基于html+css的图展示114

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

chatgpt赋能python:Python与Kafka的对接方法介绍

Python与Kafka的对接方法介绍 Kafka作为一种高吞吐量的分布式消息系统&#xff0c;近年来在数据处理、大数据分析以及实时流计算等领域得到了广泛的应用&#xff0c;成为了数据处理和分析领域中的标配。而Python作为一种简单易学、功能强大的编程语言&#xff0c;也因其在数据…

学习WooCommerce跨境电商社交媒体营销

WooCommerce 长期以来一直为电子商务店主提供多样化的服务。大约 500 万家商店啓用安装了免费的 WooCommerce 插件。 官方 WooCommerce 插件从 WordPress.org 下载了161,908,802次&#xff0c;并且还在增加。 超过5,106,506 个网站正在使用 WooCommerce。 本文网址: https…

pytorch相关报错【报错】

AttributeError: cannot assign module before Module.init() call 原因&#xff1a;自定义类中缺少supre()函数 解决 KeyError: tensor(1) 报错原因&#xff1a;tensor不能作为字典的键 解决&#xff1a;转化为numpy x torch.tensor([1,2,3]) y {1:1,2:2,3:3} z [y[i]…

提交arxiv的格式调整与流程

提交arxiv的格式调整与流程 进入arxiv网站&#xff08;注册或登录&#xff09;: https://arxiv.org/ 点击发布submission 上传本地资源&#xff0c;完成以下步骤&#xff1a; 许可证一般需要选&#xff1a; 这个表示最小的利益冲突&#xff0c;因为我们最后肯定希望publi…

如何在项目中优雅的抛出异常,这些知识佬们还记得嘛

前言&#xff1a; 本篇文章主要讲解Java中的几种异常关键字和异常类相关知识。该专栏比较适合刚入坑Java的小白以及准备秋招的大佬阅读。 如果文章有什么需要改进的地方欢迎大佬提出&#xff0c;对大佬有帮助希望可以支持下哦~ 小威在此先感谢各位小伙伴儿了&#x1f601; 以…

lua编程——air724二次开发之点亮led教程

一.硬件 硬件型号&#xff1a;银尔达 Core-Air724模块&#xff1b; 杜邦线若干&#xff1b; micro Usb线&#xff1b; USB转TTL工具&#xff1b; 杜邦线用于电源(12V/1A)和TTL信号连接&#xff0c;micro Usb用于下载和调试。 硬件资源&#xff0c;如下图&#xff1a; 二.软件 u…

❤️最详细的Python学习路线-图文不废话

当谈论学习Python编程时&#xff0c;有许多不同的途径和资源可供选择。为了帮助你建立起一个学习Python的有效路线&#xff0c;下面是一个包含基本步骤和关键资源的建议。请注意&#xff0c;这只是一个指南&#xff0c;你可以根据自己的兴趣和学习风格进行调整。 ❝ 以下时间不…

推荐对象转换解决方案:MapStruct

1、什么是MapStruct 1.1 JavaBean 的困扰 对于代码中 JavaBean之间的转换&#xff0c; 一直是困扰我很久的事情。在开发的时候我看到业务代码之间有很多的 JavaBean 之间的相互转化&#xff0c; 非常的影响观感&#xff0c;却又不得不存在。我后来想的一个办法就是通过反射&a…

Django新手必看:从入门到精通Web应用开发①【文末送书三本】

Django新手必看&#xff1a;从入门到精通Web应用开发① 1. Django是什么1.2 Django的由来1.3 Django的命名1.4 Django的版本发布1.5 Django框架的特点 2 Django的设计模式2.1 MVC设计模式2.2 MTV设计模式 3 Django安装与配置3.1 Python支持版本&#xff1a;3.2 Django 3.2与4.1…

Filter设计模式,责任链模式一如既往的妙

场景1&#xff1a; 每种Filter进行某种处理&#xff0c;将各个Filter连在一起形成一个FilterChain。当需要往FilterChain中加入新的Filter&#xff0c;或者改变各个Filter的处理顺序时&#xff0c;可以方便的扩展。 1个接口&#xff1a; public interface Filter {public Str…

前端技术搭建拼图小游戏(内含源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了俄罗斯方块游戏&#xff0c;今天还是继续按照我们原定的节奏来带领大家完成一个拼图游戏&#xff0c;功能也比较简单简单&#xff…

chatgpt赋能python:Python数组:如何使用Python将数据存入数组中

Python数组&#xff1a;如何使用Python将数据存入数组中 Python是一个非常强大的高级编程语言&#xff0c;在人工智能、数据科学和机器学习等领域有广泛应用。Python允许将数据存储在不同的数据结构中&#xff0c;其中&#xff0c;数组是最常用的。 在这篇文章中&#xff0c;…

卡尔曼滤波与组合导航原理(一)滤波的基本概念、递推最小二乘

文章目录 一、滤波的基本概念1、传统数字滤波器2、现代控制中的状态观测器3、最优估计的含义4、温度估计的例子1.问题描述2.分析 二、递推最小二乘 课程链接&#xff1a;https://www.bilibili.com/video/BV11K411J7gp/?p1 参考书目&#xff1a;《捷联惯导算法与组合导航原理》…