数据结构——图(图的存储及基本操作)

2023-09-15 14:59:40


前言

  1. 邻接矩阵法(图的顺序存储结构)
    1.1 无向图邻接矩阵算法
    1.2 有向图邻接矩阵算法
  2. 邻接表法(图的一种链式存储结构)

一、邻接矩阵法(顺序存储)

  1. 定义:用一个一维数组存储顶点,一个二维数组存储边的信息(各顶点之间邻接关系),n个顶点是n×n的矩阵,若(vi,vj)属于E ,则A[i][j]=1,否则等于0;对于带权图,则邻接矩阵中对应项存放着该边对应的权值,若顶点vi和vj不相连,则用∞来表示这两个顶点之间不存在边【是表示顶点之间相邻关系的矩阵。所谓两顶点的相邻关系即它们之间有边相连。】
  2. 注意
    ①无向图的邻接矩阵是对称矩阵,对规模特大的邻接矩阵可采用压缩存储
    ②邻接矩阵表示法的空间复杂的为O(n^2),其中n为图的定点数|V|
  3. 图的邻接矩阵存储表示法具有以下特点:
    1)无向图的邻接矩阵一定是一个对称矩阵(并且唯一),因此,在实际存储邻接矩阵时只需存储上(或下)三角矩阵的元素即可
    在这里插入图片描述
    在这里插入图片描述
    2)对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非无穷元素)的个数正好是第i个顶点的度TD(vi)
    3)对于有向图,邻接矩阵的第i行(或第i列)非零元素(或非无穷元素)的个数正好是第i个顶点的出度OD(vi)(或入度ID(vi)),第i行和第i列和是有向图第i结点的度
    (有向图:行出度,竖入度)
    4)用邻接矩阵存储图,很容易确定图中任意两个顶点时间是否有边相连。但是,要确定图中有多少边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。这是用邻接矩阵存储图的局限性
    5)稠密图适合使用邻接矩阵的存储表示
    在这里插入图片描述
    在这里插入图片描述
  4. 无向图的邻接矩阵是对称的,如果A[i,j]=1,必有A[j,i]=1。这说明,只输入和存储其上三角阵元素即可得到整个邻接矩阵。
  5. 一般有向图的邻接矩阵是不对称的,A[i,j]不一定等于A[j,i]。
  6. 邻接矩阵用二维数组即可存储,定义如下:
    int adjmatrix = ARRAY[n][n];
  7. 如果图的各边是带权的,只需将矩阵中的各个1元素换成相应边的权即可。
    在这里插入图片描述
  8. 对于无向图而言:顶点Vi的度是邻接矩阵中第i行(或列)的元素之和。
  9. 对于有向图而言:
    顶点Vi的出度是邻接矩阵中第i行的元素之和。
    顶点Vi的入度是邻接矩阵中第i列的元素之和

1.无向图存储邻接矩阵算法

int creatgraph (int adjarray[ ][ ])
{
        int i,j,v1,v2,num;
        scanf (%d”,&num);   /*输入顶点数*/
        if (num>0)
       {
            for (i=1;i<=num;i++)
                 for (j=1;j<=num;j++)
                       adjarry [i][j]=0;   /*矩阵初始化*/
do{
               scanf (%d,%d”,&v1,&v2); /*输入边*/
                 adjarray[v1][v2]=1;
                 adjarray[v2][v1]=1;
            } while(v1!=0 && v2!=0);
       }
       else  
            num=0;
       return num;
 }
            

2.有向图存储邻接矩阵算法

int creatgraph (int adjarray[ ][ ])
{
        int i,j,v1,v2,num;
        scanf (%d”,&num);   /*输入顶点数*/
        if (num>0)
       {
            for (i=1;i<=num;i++)
                 for (j=1;j<=num;j++)
                       adjarry [i][j]=0;   /*矩阵初始化*/
do{
               scanf (%d,%d”,&v1,&v2); /*输入边*/
                 adjarray[v1][v2]=1;
            } while(v1!=0 && v2!=0);
       }
       else  
            num=0;
       return num;
 }
            

二、邻接表法(图的链式存储结构)

1.定义:对图G中每个顶点建立一个单链表,第i个单链表结点表示依附于顶点vi的边(有向图是以顶点vi为尾的弧)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2. 邻接表特点

(1)如果G为无向图,则所需存数空间为O(|V|+2|E|),若为有向图,则需O(|V+|E|)
(2)邻接表中给定一顶点,能够很容易找到所有邻边,而邻接矩阵中需要扫描一行,时间为O(n);但是若要确定两个顶点间是否存在边,则在邻接矩阵里可以立即查找,而在邻接表需要对相应结点的边表里查找另一结点,效率较低
(3)有向图邻接表中,求一个给定顶点的出度只需计算其邻接表结点个数,但要求入度,需遍历整表,也可用逆邻接表
(4)无向图设存储顶点的一维数组大小为m(m>=图的顶点数n),
图的边数为e,G占用存储空间为:m+2*e。(有向图)G占用存储空间与G的顶点数、边数均有关;适用于边稀疏的图
(5)有向图中
顶点Vi的出度为第i个单链表中的结点个数
顶点Vi的入度为整个单链表中邻接点域值是i的结点个数
判定两顶点v,u是否邻接:要看v对应线性链表中有无对应的结点u

在这里插入图片描述
在这里插入图片描述

总结

  1. 邻接矩阵法(图的顺序存储结构)
    1.1 无向图邻接矩阵算法
    1.2 有向图邻接矩阵算法
  2. 邻接表法(图的一种链式存储结构)
更多推荐

【已解决】matrix contains invalid numeric entries,记录bug修改

文章目录摘要原因解决办法图像分类网络AlexNetVGGNetGooLeNet系列ResNetDenseNetSwinTransformerMAECoAtNetConvNeXtV1、V2MobileNet系列MPViTVITSWAEfficientNet系列MOBILEVITEdgeViTsMixConvRepLKNe

绘图系统四:定制绘图风格

文章目录创建控件绘图风格可定制绘图风格的绘图系统代码组织📈一三维绘图系统📈二多图绘制系统📈三坐标轴定制源码地址Python打造动态绘图系统创建控件尽管从matplotlib的角度来说,绘图风格也算是图像类型的一部分,但诸如点线字体标题等内容太过复杂,为了减轻DrawType的负担,所以新建一个组件。有了DrawT

R语言RSTAN MCMC:NUTS采样算法用LASSO 构建贝叶斯线性回归模型分析职业声望数据...

全文链接:http://tecdat.cn/?p=24456如果你正在进行统计分析:想要加一些先验信息,最终你想要的是预测。所以你决定使用贝叶斯(点击文末“阅读原文”获取完整代码数据)。相关视频但是,你没有共轭先验。你可能会花费很长时间编写Metropolis-Hastings代码,优化接受率和提议分布,或者你可以使用

【医学影像数据处理】 Dicom 文件格式处理汇总

在医学影像的数据存储领域,是存在一定的行业标准的。X光、CT机器等等医疗器械等生产企业,会依据行业标准,对采集的数据进行规范化的存储。这里面就包括了大名鼎鼎的DICOM3.0协议,上述的摄影形式大部分也都是以这种形式进行存储和传播的。但是呢,在医学领域进行数据处理的时候,经常会遇到除DICOM外其他的数据形式,比如常见

gateway之断言的使用详解

文章目录gateway产生的背景,为什么要是用gateway什么是网关gateway带来的好处功能特征gateway在项目中使用的依赖什么是断言断言分类内置自定义示例断言和过滤器的不同gateway产生的背景,为什么要是用gateway一个系统会被拆分为多个微服务,作为客户端要如何去调用这么多的微服务?如果没有网关的存

使用 Amazon EC2 预留实例最大限度地节省成本和提高灵活性

简介:随着云计算不断改变企业的运营方式,优化成本已成为首要任务。利用AmazonEC2预留实例是实现云端成本节约最有效的方法之一。本文将探讨什么是AmazonEC2预留实例,它与按需实例的区别,以及它在成本节约和灵活性方面提供的好处。背景:云计算改变了IT格局,使企业能够按需扩展基础设施,仅为所消耗的资源付费。但是,随

短视频矩阵系统源代码开发搭建分享--代码开源SaaS

一、什么是短视频矩阵系统?短视频矩阵系统是专门为企业号商家、普通号商家提供帐号运营从流量到转化成交的一站式服务方案,具体包含:点赞关注评论主动私信,评论区回复,自动潜客户挖掘,矩阵号营销,自动化营销,粉丝管理等功能,可以帮助企业或商家快速批量制作高质量短视频,扩大企业宣传,提升企业经营效果。通过短视频矩阵系统的运营,可

React面试题总结(一)

1、redux本来是同步的,为什么它能执行异步代码?实现原理是什么?中间件的实现原理是什么?1、Redux-thunk这个中间件支持异步操作2、执行异步的操作首先需要下载一个thunk,通过thunk来进行异步的一个操作,支持异步操作,可以使用dispatch和getState来进行数据的获取或状态3、Redux是一个

【C++】STL—— unordered_map的介绍和使用、 unordered_map的构造函数和迭代器、 unordered_map的增删查改函数

文章目录1.unordered_map的介绍2.unordered_map的使用2.1unordered_map的构造函数2.2unordered_map的迭代器2.3unordered_map的容量和访问函数2.4unordered_map的增删查改函数1.unordered_map的介绍unordered_map的

【Java 基础篇】Java多线程编程详解:线程创建、同步、线程池与性能优化

Java是一门强大的编程语言,其中最引人注目的特性之一是多线程支持。多线程允许我们在同一程序中同时执行多个任务,这大大提高了应用程序的性能和响应能力。本文将深入介绍Java线程的基础知识,无论您是初学者还是有一些经验的开发人员,都将从中获益。什么是线程?在计算机科学领域,线程是指在一个进程内部执行的独立单元。一个进程可

多线程设计模式【线程安全、 Future 设计模式、Master-Worker 设计模式 】(一)-全面详解(学习总结---从入门到深化)

目录SingleThreadExecution设计模式线程安全Future设计模式Master-Worker设计模式生产者消费者设计模式定义不可变对象的策略SingleThreadExecution设计模式机场过安检SingleThreadExecution模式是指在同一时刻只能有一个线程去访问共享资源,就像独木桥一样

热文推荐