图(网)的存储结构(数组存储表示即邻接矩阵、邻接表)

图(Graph)是一种非线性结构

图的特点(多对多),顶点之间的关系是任意的,图中任意两个顶点之间都可能相关,顶点的前驱和后继个数无限制。

图:数据元素间存在多对多关系的数据结构,加上一组基本操作构成的抽象数据类型。

图的基本术语

顶点:图中的数据元素。

弧:若 <v, w>∈VR,则 <v, w> 表示从 v 到 w 的一条弧,且称 v 为弧尾,称 w 为弧头,此时的图称为有向图。

G1 = (V1, A1)          V1 = {v1, v2, v3, v4}

A1 = {< v1, v2>, < v1, v3>, < v3, v4>, < v4, v1>}

边:若 <v, w>∈VR 必有<w, v>∈VR,则以无序对 (v, w) 代表这两个有序对,表示 v 和 w 之间的一条边,此时的图称为无向图。

G2 = (V2, E2)           V2 = {v1, v2, v3, v4, v5}

E2 = {(v1, v2), (v1, v4), (v2, v3), (v2, v5) , (v3, v4), (v3, v5)}

无向图中边的取值范围:0≤e≤n(n-1)/2。(用 n 表示图中顶点数目,用 e 表示边的数目。且不考虑顶点到其自身的边。)

完全图:有 n(n-1)/2 条边的无向图(即:每两个顶点之间都存在着一条边)称为完全图。

有向图中弧的取值范围:0≤e≤n(n-1)。(用 n 表示图中顶点数目,用 e 表示弧的数目。且不考虑顶点到其自身的弧。)

有向完全图:有 n (n - 1) 条弧的有向图(即:每两个顶点之间都存在着方向相反的两条弧)称为有向完全图。

稀疏图:含有很少条边或弧的图。

稠密图:含有很多条边或弧的接近完全图的图。

权:与图的边或弧相关的数,这些数可以表示从一个顶点到另一个顶点的距离或耗费。

网: 带权的图。

子图:如果图 G = (V, E) 和 G´= (V ´, E´),满足:V ´包含于V 且 E´包含于 E,则称 G´为G 的子图。

   

邻接点:若 (v, v´) 是一条边,则称顶点 v 和 v´互为邻接点,或称 v 和 v´相邻接;称边 (v, v´) 依附于顶点 v和 v´,或称 (v, v´) 与顶点 v 和 v´ 相关联。若 <v, v´> 是一条弧,则称顶点 v 邻接到 v´,顶点v´邻接自顶点 v。并称弧 <v, v´> 与顶点 v 和 v´ 相关联。

度:无向图中顶点 v 的度是和 v相关联的边的数目,记为:TD(v)。

入度:有向图中以顶点 v 为头的弧的数目称为 v 的入度,记为:ID(v)。

出度:有向图中以顶点 v 为尾的弧的数目称为 v 的出度,记为:OD(v)。

度:入度和出度之和,即:TD(v) = ID(v) + OD(v)。

如果顶点 vi 的度为 TD(vi),则一个有 n 个顶点 e 条边(弧)的图,满足如下关系:

路径:从顶点 v 到 v´ 的路径是一个顶点序列。对于有向图,路径也是有向的。

路径长度:路径上边或弧的数目。

回路(环):第一个顶点和最后一个顶点相同的路径。

简单路径:序列中顶点不重复出现的路径。

连通:从顶点 v 到 v´ 有路径,则说 v  和 v´ 是连通的。

连通图:图中任意两个顶点都是连通的。

连通分量:无向图的极大连通子图(该子图是 连通子图,G中再加一个顶点就不连通,再减一条边就不极大);任何连通图的连通分量只有一个,即其本身;非连通图有多个连通分量(非连通图的每一个连通部分)。

强连通图: 任意两个顶点都连通的有向图。

强连通分量:有向图的极大强连通子图(该子图是强连通子图,图中再加一个顶点就不连通,再减一条边就不极大);任何强连通图的强连通分量只有一个,即其本身;非强连通图有多个强连通分量。

连通图的生成树:包含无向图G 所有顶点的的极小连通子图(该子图是G 的连通子图,在该子图中删除任何一条边,子图不再连通;加入一条边,则子图一定有环。 )一个图可以有许多棵不同的生成树。

所有生成树具有以下共同特点:

1、生成树的顶点个数与图的顶点个数相同;

2、生成树是图的极小连通子图;

3、一个有 n 个顶点的连通图的生成树有 n-1 条边;

4、生成树中任意两个顶点间的路径是唯一的;

5、在生成树中再加一条边必然形成回路。

6、含 n 个顶点 n-1 条边的图不一定是生成树。

(无向图) 生成森林:由若干棵生成树组成,含有图中全部顶点,但只有足以构成若干棵不相交的生成树的边。

有向树:如果一个有向图恰有一个顶点的入度为 0 ,其余顶点的入度均为 1 ,则是一棵有向树。

有向图的生成森林:由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧。

图的存储结构

图的存储结构要保存两类信息:

1)顶点的数据

2)顶点间的关系

顺序存储:任意两顶点都可能有联系,不能用元素在存储区中的物理位置来表示元素之间的关系。

多重链表:与树类似,浪费存储单元;操作不方便。

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

一个有 n 个顶点的图,可用两个数组存储。其中一个一维数组存储数据元素(顶点)的信息,另一个二维数组(邻接矩阵)存储数据元素之间的关系(边或弧)的信息。

邻接矩阵:设 G = (V, VR) 是具有 n 个顶点的图,顶点的顺序依次为 {v1, v2, …, vn},则 G  的邻接矩阵是具有如下性质的 n 阶方阵:

比如:

使用邻接矩阵存储

再比如

使用邻接矩阵

特点:

1、无向图的邻接矩阵对称,可压缩存储;有 n 个顶点的无向图所需存储空间为 n(n-1)/2。

2、有 n 个顶点的有向图所需存储空间为n²,用于稀疏图时空间浪费严重。占用存储空间只与它的顶点数有关,与边数无关;适用于边稠密的图;

3、无向图中顶点 vi 的度 TD(vi) 是邻接矩阵中第 i 行 1 的个数。

4、有向图中:顶点 vi 的出度是邻接矩阵中第 i 行 1 的个数。 顶点 vi 的入度是邻接矩阵中第 i 列 1 的个数。

网的邻接矩阵可定义为:

使用邻接矩阵表示

代码如下:

//图的数组存储表示
#define INFINTY INT_MAX//最大值
#define MAX_VERTEX_NUM 20;//最大的顶点个数
typedef enum{
    //有向图
    destinationGraphic,
    //有向网
    destinationNet,
    //无向图
    unDestinationGraphic,
    //无向网
    unDestinationNet
} GraphKind;

typedef struct AreCell{
    //顶点的关系类型,对于无权图,用1或者0来表示相邻否,带权图(网)用权值或者无穷大表示相邻否
    int adj;
    //弧(边)相关信息的指针
    int *info;
} AreCell, AdjMartix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct{
    //顶点向量
    int vexs[MAX_VERTEX_NUM];
    //邻接矩阵
    AdjMartix arcs;
    //图的当前顶点数和弧边数
    int vexnum, arcnum;
    //图的种类标志
    GraphKind kind;
} MGraph;

邻接表(类似于树的孩子链表表示法)

邻接点域,存放与 vi 邻接的顶点在表头数组中的位置。

链域,指示下一条边或弧。

表头结点之后的链表,表示的是该表头的结点代表的图的顶点的邻接的顶点,其中数据域的数字代表的是表头数组的下标,也就是顶点。

若无向图中有 n 个顶点、e 条边,则其邻接表需 n 个头结点和 2e 个表结点。适宜存储稀疏图。

无向图中顶点 vi 的度为第 i 个单链表中的结点数。

建立无向邻接表

思想:如何给存储结构赋值

1.建立顶点数组。读入各顶点数据vextex,将link域赋Null。

2.建立各顶点的邻接表。

读入顶点对<i,j>,  生成两个节点,分别插入顶点j,i的邻接表的头部。直至处理完所有的边。

时间复杂度O(n+e)

时间: 2024-10-05 05:07:31

图(网)的存储结构(数组存储表示即邻接矩阵、邻接表)的相关文章

java 数据结构 图中使用的一些常用算法 图的存储结构 邻接矩阵:图的邻接矩阵存储方式是用两个数组来标示图。一个一位数组存储图顶点的信息,一个二维数组(称为邻接矩阵)存储图中边或者弧的信息。 设图G有n个顶点,则邻接矩阵是一个n*n的方阵,定义为: 实例如下,左图是一个无向图。右图是邻接矩阵表示:

以下内容主要来自大话数据结构之中,部分内容参考互联网中其他前辈的博客. 图的定义 图是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为G(V,E),其中,G标示一个图,V是图G中顶点的集合,E是图G中边的集合. 无边图:若顶点Vi到Vj之间的边没有方向,则称这条边为无项边(Edge),用序偶对(Vi,Vj)标示. 对于下图无向图G1来说,G1=(V1, {E1}),其中顶点集合V1={A,B,C,D}:边集合E1={(A,B),(B,C),(C,D),(D,A),(A,C)}: 有向图:若

线性存储结构--数组

#include<stdio.h> #include<stdlib.h> //定义了一个数据类型叫struct Arr 该数据类型包含 3个成员 struct Arr{ //12个字节 int *pBase;//存储数组第一个元素的地址 int len;//数组所能容纳的最大元素个数 int cnt;//当前数组有效元素的个数 }; //不用指针 用值得话 导致方法里存在局部变量 不能使主方法的改变 只能传地址 void Init_arr(struct Arr *p,int len

图基本算法 图的表示方法 邻接矩阵 邻接表

要表示一个图G=(V,E),有两种标准的表示方法,即邻接表和邻接矩阵.这两种表示法既可用于有向图,也可用于无向图.通常采用邻接表表示法,因为用这种方法表示稀疏图(图中边数远小于点个数)比较紧凑.但当遇到稠密图(|E|接近于|V|^2)或必须很快判别两个给定顶点手否存在连接边时,通常采用邻接矩阵表示法,例如求最短路径算法中,就采用邻接矩阵表示. 图G=<V,E>的邻接表表示是由一个包含|V|个列表的数组Adj所组成,其中每个列表对应于V中的一个顶点.对于每一个u∈V,邻接表Adj[u]包含所有满

数据结构学习笔记05图 (邻接矩阵 邻接表--&gt;BFS DFS)

数据结构之图 图(Graph) 包含 一组顶点:通常用V (Vertex) 表示顶点集合 一组边:通常用E (Edge) 表示边的集合 边是顶点对:(v, w) ∈E ,其中v, w ∈ V 有向边<v, w> 表示从v指向w的边(单行线) 不考虑重边和自回路 无向图:边是无向边(v, w) 有向图:边是有向边<v, w> 连通:如果从V到W存在一条(无向)路径,则称V和W是连通的 连通图(Connected Graph):如果对于图的任一两个顶点v.w∈V,v和w都是连通的,则称

《大话数据结构》笔记(7-2)--图:存储结构

第七章  图 图的存储结构 图不能用简单的顺序存储结构来表示. 而多重链表的方式,即以一个数据域和多个指针域组成的结点表示图中的一个顶点,尽管可以实现图结构,但是会有问题,比如若各个顶点的度数相差很大,按度数最大的顶点设计结点结构会造成很多存储单元的浪费,而若按每个顶点自己的度数设计不同的顶点结构,又带来操作的不便. 对于图来说,如何对它实现物理存储是个难题.图有以下五种不同的存储结构. 邻接矩阵 图的邻接矩阵(Adjacency Matrix)存储方式使用过两个数组来表示图.一个一维数组存储图

数据结构之图(术语、存储结构、遍历)

1.相关术语 顶点(Vertex).弧(Arc).弧头(初始点).弧尾(终结点).边(Edge).有向图(Directed graph).无向图(Undigraph).完全图(Completed grapg).有向完全图.稀疏图(Sparse graph).稠密图(Dense graph).权(weigh).网(network).无向网.有向网.子图(Subgraph).邻接点(Adjacent).度(Degree).入度(Indegree).出度(Outdegree).路径(path).简单路

数据结构 - 图的存储结构

图的抽象数据类型定义 图是一种数据结构,加上一组基本操作就构成了图的抽象数据类型. 图的抽象数据类型定义如下: ADT Graph{ 数据对象V:具有相同特性的数据元素的集合,称为顶点集. 数据关系R:R={VR} VR={<v,w>|<v,w>| v,w?V∧p(v,w) ,<v,w>表示 从v到w的弧,P(v,w)定义了弧<v,w>的信息 } 基本操作P: Create_Graph() : 图的创建操作. 初始条件:无. 操作结果:生成一个没有顶点的空图

图数据结构(期限、存储结构、遍历)

1.相关条款 顶点(Vertex).弧形(Arc).圆弧头(初始点).圆弧终点(端点).边缘(Edge).向图(Directed graph).无向图(Undigraph).完全图(Completed grapg).导演完全图.稀疏图(Sparse graph).密集图(Dense graph).权(weigh).网(network).无向网.有向网.子图(Subgraph).邻接点(Adjacent).度(Degree).入度(Indegree).出度(Outdegree).路径(path).

图的理解:存储结构与邻接矩阵

存储结构 要存储一个图,我们知道图既有结点,又有边,对于有权图来说,每条边上还带有权值.常用的图的存储结构主要有以下二种: 邻接矩阵 邻接表 邻接矩阵 我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之间的关系,则无法简单地用一维数组来表示了,我们可以用二维数组来表示,也就是一个矩阵形式的表示方法. 我们假设A是这个二维数组,那么A中的一个元素aij不仅体现出了结点vi和结点vj的关系,而且aij的值正可以表示权值的大小. 以下是一个无向图的邻接矩阵表示示例: 从上图我们可