学习笔记:图的基本概念和存储方式

图的基本概念和存储方式

图的基本概念

图(Graph)是一种较线性表和树更为复杂的数据结构。

线性结构中,数据元素之间仅存在线性关系

树型结构中,数据元素之间存在明显的一对多的层次关系

而在图型结构中,结点之间是多对多的任意关系

图的结构定义:

图是由顶点集V弧集R构成的数据结构。Graph = (V,R)

其中:V={v|v属于DataObject} R ={VR}

​ VR = {<v,w>|p(v,w)且(v,w属于V)}

<v,w>表示从v到w的一条弧,并称v为弧尾,w为弧头。

谓词P(v,w)定义了弧<v,w>的意义和信息,表示从v到w的一条单向通道。

有向图:由于"弧"是有方向的,因此称由顶点集弧集构成的图为有向图。

例如:

在这里插入图片描述

其中,V1={A,B,C,D,E}

​ VR1={<A,B>,<A,E>,<b,C>,<C,D>,<D,B>,<D,A>,<E,C>}

无向图:由顶点集边集构成的图称作无向图。

在这里插入图片描述

其中,V2={A,B,C,D,E,F}

​ VR2={(A,B),(A,E),(B,E),(C,D),(D,F),(B,F),(C,F)}

有向图或无向图中的弧或边带权后的图分别称作有向网或无向网。

在这里插入图片描述

子图:设图G={V,{VR}}和图G’={V’,{VR’}},且V‘包含于V,VR’包含于VR,则称G‘为G的子图。

在这里插入图片描述

完全图:假设图中有n个顶点,e条边,则含有e=n(n-1)/2条边的无向图称作完全图。

有向完全图:含e=n(n-1)条弧的有向图称为有向完全图。

稀疏图与稠密图

若边或弧的个数e<nlogn,则称为稀疏图,否则称作为稠密图。

邻接点

无向图顶点v和w之间存在一条边(v,w),则称顶点v和w互为邻接点,称边(v,w)依附于顶点v和w或边(v,w)与顶点v和w相关联

与顶点v关联的边的数目定义为v的度(TD) (总度数等于总边数的二倍)

对于有向图,若顶点v和w之间存在一条边<v,w>,则称顶点v邻接到w,顶点w邻接自v,称弧(v,w)与顶点v和w相关联

以v为尾的弧的数目定义为v的出度(OD)。

以v为头的弧的数目定义为v的入度(ID)。

出度+入度=该顶点的度(TD)。

在这里插入图片描述

简单路径:顶点不重复的路径。

回路:首尾顶点相同的路径。

简单回路:中间顶点不重复的回路。

连通图

无向图G中任意两个顶点之间都有路径相同,则称此图为连通图。(区别:完全图是路径可达

否则为非连通图。

在这里插入图片描述

无向图中各个极大连通子图称为此图的连通分量

有向图中,若任意两个顶点之间都存在一条路径,则称此有向图为强连通图

否则为非强连通图。

在这里插入图片描述

否则,其各强连通子图称作为它的强连通分量

假设一个连通图有n个顶点和e条边,其中n-1条边和n个顶点构成一个极小连通子图,称该极小连通子图为此连通图的生成树。

在这里插入图片描述

非连通图,则称由各个连通分量的生成树的集合为此非连通图的森林

在这里插入图片描述

图的存储方式

图的邻接矩阵表示法(数组表示法)

一维数组:用于存储顶点的信息。

二维数组:用于存储图中顶点之间关联关系——邻接矩阵

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

对于带权图或者网中

在这里插入图片描述

在这里插入图片描述

图的邻接矩阵表示法(数组表示法)形式化描述:

#define INFINITY INT_MAX  //最大值无穷
#define MAX_VERTEX_NUM 20	//最大顶点个数
typedef enum {DG,DN,UDG,UDN} GraphKind; //{有向图,有向网,无向图,无向网}
typedef struct ArcCell{
	VRType adj;	//VRType是顶点关系类型。对无权图,用1或0。
				//表示相邻与否;对带权图,则为权值类型。
	InfoType *info;//该弧相关信息的指针
}ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct{
	VertexType vexs[MAX_VERTEX_NUM];	//顶点向量
	AdjMatrix arcs;						//顶点矩阵
	int vexnum,arcnum;					//图的当前顶点数和弧数
	GraphKind kind;						//图的种类标志
}MGraph;

图的邻接矩阵表示法(数组表示法)特点:

在这里插入图片描述

图的邻接表表示法(链式存储法)

对图中每个顶点建立一个单链表,第i个单链表中的结点表示依附于顶点vi的边

  1. 表头结点

在这里插入图片描述

  1. 表结点

    在这里插入图片描述

    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

#define MAX_VERTEX_NUM 20
typedef enum {DG,DN,UDG,UDN} GraphKind; //{有向图,有向网,无向图,无向网}
typedef struct ArcNode
{
    int adjvex;						    //该弧所指向的顶点的位置
    struct ArcNode *nextarc;			//指向下一条弧的指针
    InfoType *info;						//该弧相关信息的指针
}ArcNode;
typedef struct VertexNode
{
    VertexData data;					//顶点信息
    ArcNode *firstarc;·					//指向第一条依附该顶点的弧的指针
}VertexNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
    AdjList vertices;
    int vexnum,arcnum;					//图的当前顶点数和弧数
    GraphKind kind;						//图的种类标志
}

图的邻接表表示法(链式存储法)特点:

在这里插入图片描述

逆邻接表:

在这里插入图片描述

图的十字链表表示法(链式存储法)

顶点和弧分别各用一种存储结构的结点表示。弧头相同的弧被链在同一链表上,弧尾相同的弧也被链在同一链表上,链表的头结点就是顶点结点

在这里插入图片描述

在这里插入图片描述

无向图的邻接多重表表示法

顶点和边分别用一种存储结构的结点表示。

依附于相同顶点的边被链在同一链表上,每条边依附于两个顶点,**所以每个边结点同时被链接在两个链表中,链表的头节点就是顶点结点。**同时还在边结点中增加了一个访问标志位。

在这里插入图片描述

在这里插入图片描述


在这里插入图片描述

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿小张的日常笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值