【邻接矩阵】

图的邻接矩阵存储也称数组表示法,其方法是用一个一维数组存储图中的顶点,用一个二维数组存储图中的所有的边,存储顶点之间邻接关系的二维数组称为邻接矩阵

设图 G=(V,E) 具有 n 个顶点,则其邻接矩阵是一个 n*n 的方阵,定义为:

若 G 是网图,则有:

,其中  是边 (vi,vj) 或 弧 <vi,vj> 上的权值,INF 代表一极大的数,其大于所有边的权值。

其对确定边操作效率高,但由于其过高的空间复杂度,对稀疏图来说造成了极大的浪费,且由于二维数组可开的空间范围有限,因此邻接矩阵一般适用于点较少的图。

int n;
int G[N][N];
void init(){memset(g,0,sizeof(g));//图的初始化cin>>n;//读入数据个数while(n--){cin>>i>>j>>w;//读入两个顶点序号及权值G[i][j]=w;//对于不带权的图,可令g[i][j]=1G[j][i]=w;//无向图的对称性,若是有向图,没有此句}
}

【邻接表】

邻接表是一种顺序存储与链接存储相结合的存储方法,类似于树的孩子链表表示法。

对于图 G 的每个顶点 vi,将所有邻接于 vi 的顶点链成一个单链表,称为 vi 的边表,若图 G 是一有向图,则称为 vi 的出边表

为方便对所有边表的头指针进行存储操作,使用顺序存储,这样,存储边表头指针的数组和存储顶点信息的数组构成了邻接表的表头数组,称为顶点表

相较于邻接矩阵,其由数组转链表,由定长转不定长,内存利用率高,能较好的处理稀疏图,对不确定的边操作较为方便,但由于存储方式的问题,其对重边不好处理,且对确定边处理效率并不高。

struct Edge{//边表int pos;//位置域,存放该顶点的邻接点在顶点表中的下标int dis;//数据域,对于网图,增设一存取边上信息的域Edge *next;//指针域,指向边表中下一结点
};
struct Node{//顶点表int pos;//位置域,存放顶点信息Edge *firstEdge;//指针域,指向边表中的第一个结点
}node[N];
int n,m;
void init(){for(int i=0;i<n;i++){//n个点cin>>node[i].pos;node[i].firstEdge=NULL;}for(int i=0;i<m;i++){//m条边int x,y;cin>>x>>y;//边所依附的两点编号Edge *p;//边表结点//添边x->yp->pos=y;p->next=node[x].firstEdge;node[x].firstEdge=p;//添边y->xp->pos=x;p->next=node[y].firstEdge;node[y].firstEdge=p;}
}

【前向星】

对于邻接矩阵来说,其方便但效率低,对于邻接表来说,其虽效率较高但实现较为困难,而前向星就是一个介于两者之间的较为中庸的结构,其虽然好写,但效率较邻接表来说较低,且其不能直接用顶点进行定位,对重边不好处理,只能与邻接表一样遍历判重。

前向星以储存边的方式来存储图,其通过读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序进行构造。

常用于具有多个点或两点间具有多条弧的情况,其缺点是不能直接用顶点进行定位。

int n,m;
vector<int> edge[N];
void init(){cin>>n>>m;for(int i=0;i<m;i++){int x,y;cin>>x>>y;//边所依附的两点编号edge[x].push_back(y);//添边x->yedge[y].push_back(x);//添边y->x}
}

【链式前向星】

由于前向星的效率并不高,因此可对其进行优化,在优化为链式前向星后,内存利用率极高,效率也得到了极大的提升,在图论题中,链式前向星可适用于所有的图。

但经过优化后,其缺点也很明显,即:操作复杂化、不好处理重边等

struct Edge{int next;//下一条边的数组下标int to;//该边的另一个顶点int dis;//该边的权值
}edge[N];
int n,m;//点数,边数
int head[N];//head[i]表示顶点i的第一条边的数组下标,-1表示顶点i没有边
int tot;//边的条数即边序号
void addEdge(int from,int to,int dis){edge[tot].dis=dis;//权值edge[tot].to=to;//另一顶点edge[tot].next=head[from];//同结点下该边的下一条边head[from]=tot++;//结点from的第一条边
}
int mian(){memset(head,-1,sizeof(head));tot=0;for(int i=0;i<m;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);addEdge(x,y,w);//添边x->yaddEdge(y,x,w);//添边y->x}//遍历从x出发的所有边int x=0;for(int i=head[x];i!=-1;i=edge[i].next){int y=edge[i].to;...}...return 0;
}

【十字链表与邻接多重表】

十字链表与邻接多重表也是图的一种存储方法,但由于操作复杂、内存利用率不高等因素常不被使用。

1.十字链表

十字链表是有向图的一种存储方法,其实质上是邻接表与逆邻接表的结合,每条边对应的边结点分别组织到出边表与入边表中,其顶点表和边表结点结构如下:

对于顶点表来说,data 为数据域,存放顶点信息;firstIn 为入边表头指针,指向以该顶点为终点的弧构成的链表中的第一个结点;firstOut 为出边表头指针,指向以该顶点为始点的弧构成的链表中的第一个结点。

对于边表来说,tailPos 代表弧的起点在顶点表中的下标;headPos 代表弧的终点在顶点表中的下标;headLink 为入边表指针域,指向终点相同的下一条边;tailLink 为出边表指针域,指向起点相同的下一条边。

2.邻接多重表

用邻接表存储无向图,每条边的两个顶点分别在以该边所依附的两个顶点的边表中,这种重复存储给图的某些操作带来不便,因此有了邻接多重表。

邻接多重表主要用于存储无向图,其存储结构与邻接表类似,也有顶点表和边表组成,每条边用一个边表结点表示,其顶点表和边表的结点结构如下:

对于顶点表而言,data  为数据域,存放顶点信息;firstEdge 为边表头指针,指向依附于该顶点的第一条边的边表结点。

对于边表而言,iPos、jPos 为与某边依附的两顶点在顶点表中的下标;iLink 为指针域,指向依附于顶点 iPos 的下一条边;jLink 为指针域,指向依附于顶点 jPos 的下一条边

理论基础 —— 图 —— 图的存储结构相关推荐

  1. 图解图库JanusGraph系列-一文知晓“图数据“底层存储结构(JanusGraph data model)

    图解图库JanusGraph系列-一文知晓"图数据"底层存储结构(JanusGraph data model) 大家好,我是洋仔,JanusGraph图解系列文章,实时更新 图数据 ...

  2. 图的常见存储结构及各自的优缺点

    以下说法均建立在简单图上,即无环无重复边的图. 本文将介绍图的常见存储结构及各自的优缺点 邻接矩阵 邻接表 十字链表 邻接多重表 边集数组 邻接矩阵 用两个数组来表示图:一个一维数组存储图中顶点信息, ...

  3. java对象底层原存储结构图解_图解图库JanusGraph系列-一文知晓“图数据“底层存储结构...

    大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 转载文章请保留以下声明: 一:存储模式 留言或私信我,邀请你加入"图数据库交流"微信群! 1. ...

  4. janusgraph整合mysql_图解图库JanusGraph系列-一文知晓“图数据“底层存储结构

    527-7.jpg 大家好,我是洋仔,JanusGraph图解系列文章,实时更新~ 图数据库文章总目录: 版本:JanusGraph-0.5.2 转载文章请保留以下声明: 一:存储模式 留言或私信我, ...

  5. 图解图库Janusgraph系列-一文知晓图数据底层存储结构

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者丨匠心Java 来源丨匠心Java(code-t ...

  6. 图的邻接矩阵存储结构

    如上图,我们能够把v0标记为0,v1标记为1.... 并把联通的2点权值全设置为1,那么能够用邻接矩阵(右图)来表示 概念解析: 第一个邻接顶点: 我们以vo为例,第一个邻接顶点为V1(事实上也能够使 ...

  7. 理论基础 —— 树 —— 树的存储结构

    [父亲表示法] 由于树中每个结点均有且仅有一个父结点,那么根据这一特性,用一维数组来存储树的各个结点(一般按层序存储),数组中的一个元素对应树中的一个结点,每个结点记录两类信息:结点的数据信息.该结点 ...

  8. 14 图的基础知识-几种常用的存储结构

    时间有点紧 没时间接着更了..考完研回头再写吧 一.邻接矩阵 1.描述:用一维数组存储图顶点的信息 用二维数组存储图边的信息 2.特点: ①无向图的邻接矩阵:  是唯一的对称矩阵,可以压缩存储(仅存储 ...

  9. 图的存储结构(邻接矩阵和邻接表)

    图的存储结构(邻接矩阵和邻接表) 前言: 前面我们学习图的有些定义和术语,对图这个数据结构有了新的见解和认知,让我们理解图结构的知识,今天我们学习图的存储结构,图的存储结构比较多,我们今天主要是学习邻 ...

  10. 图——基本的图算法(一)图的存储结构

    图--基本的图算法(一)图的存储结构 1. 图的存储结构概述 对于图G=(V, E)来说,可以有两种标准的表示方法,一个是邻接矩阵,另一个是邻接链表,这两种方法都可以表示有向图和无向图.除此之外,图的 ...

最新文章

  1. tensorflow model.compile() 示例
  2. 如果MySQL的自增 ID 用完了,怎么办?
  3. Android项目Build报错Unable to execute dx(65535问题解决方案)
  4. java算法 第七届 蓝桥杯B组(题+答案) 5.抽签
  5. 入门Web前端有哪些误区?该如何避免?
  6. 查看Nginx,Apache,lighttpd,Mysql,Php的编译参数
  7. C语言——判断是该年的第几天
  8. ubuntu下链接open***
  9. ROS笔记(36) 避障运动规划
  10. ios 内联函数 inline ---分解LFLiveKit
  11. OPENSSH升级为7.4
  12. C# 将PDF文件转换为word格式
  13. 【ML小结6】关联分析与序列模式关联分析
  14. Go程序设计语言 第1章 入门
  15. Windows本地安全策略
  16. 零基础学 Python(17):if 条件语句
  17. Gmail使用POP3设置的奥秘
  18. Delphi对象克隆技术
  19. 出谋划策 小型网吧组网方案精心推荐(转)
  20. 二、 FATE实战:实现横向逻辑回归任务的训练及预测

热门文章

  1. STM32之窗口看门狗例程
  2. .metadata是什么项目文件_《深入微服务》之 如何给老婆解释什么是微服务的基础框架SpringBoot?
  3. 发现1个宝藏项目,GitHub上都没有的那种!
  4. 缓存穿透、击穿、雪崩什么的傻傻分不清楚?看了这篇文后,我明白了
  5. 重构 - 美股行情系统APP推送改造
  6. Element-UI Form表单 resetFields() 重置表单无效问题
  7. JeecgBoot 2.4 微服务正式版发布,基于SpringBoot的低代码平台
  8. Hough 圆变换----Matlab实现
  9. Linux程序分析工具介绍—ldd,nm
  10. SQL-10 获取所有非manager的员工emp_no