数据结构 图 part1

定义

图是由顶点集合(vertex)及顶点间的关系集合组成的一种数据结构

形式化定义

Graph=(V,E)

V={x|x∈某个数据对象}是顶点的有穷非空集合

· 对于n个顶点的图,对每个顶点连续编号,即顶点的编号为0~n-1

E= {(x, y)|x,y∈V}或E={<x, y>|x,y ∈V && Path (x, y)}是顶点之间关系的有穷集合,也叫做**边(**edge)集合。

· *Path (x,y)*表示从x到y的一条单向通路,它是有方向的。

在这里插入图片描述

V(G1)={0,1,2,3}
E(G1)={(1,2), (1,3),(1,0),(2,0),(2,1),(3,1),(0,1),(0,2)}

(从0到1是一条边,从1到0又是一条边;所以有八条边)

ADT

ADT Graph {

数据对象:
D= {ai| ai∈ ElemType, i=1,2…,n, n≥0} //ElemType为类型标识符数据关系;
R={<ai,aj> | ai,aj∈D, i=1,2,…,n, j=1,2…n,其中每个元素可以有零个或多个前驱节点,可以有零个或多个后继节点}
数据操作:
(1)初始化图InitGraph(&g):构造一个空的图g

(2)销毁图ClearGraph(&g):释放图g占用的内存空间

(3)DFS(G,v):从顶点v出发,深度优先遍历图g

(4)BFS(G,v):从顶点v出发,广度优先遍历图g

}

有向图和无向图

有向图

· 边之间的顶点对是有序的,则称G为有向图。

· <i,j>∈ E(G)表示由i到j方向有一条边。

无向图

· 边之间的“顶点对”是无序的,则称图G为无向图。

· (i,j)表示一条无向边和(j,i)是同一条边。

· 无向图的形式化定义:若对任意<v,w> ∈ E(G),有<w,V> ∈ E(G),则G是无向图。

完全有向图和完全无向图

完全无向图

无向图中的每两个顶点之间都存在着一条边,则此图为完全无向图。

若有n个顶点的完全无向图有n(n-1)/2条边

在这里插入图片描述

完全有向图

有向图中的每两个顶点之间都存在着方向相反的两条边,则此图为完全有向图。

有n个顶点的完全有向图有**n(n-1)**条边,

在这里插入图片描述

术语

邻接顶点

如果(u,v)是E(G)中的一条边,则称u与v互为邻接顶点。

子图

设有两个图G=(V, E)和G’=(V, E’)。若V’⊆V且E’⊆E,则称图G’是图G的子图。

在这里插入图片描述

图中每一条边都可以附有一个对应的数值,这种与边相关的数值称为权。

权可以表示从一个顶点到另一个顶点的距离花费的代价

边上带有权的图称为带权图,也称作网。

顶点的度

无向图

顶点所具有的的边的数目

有向图

以顶点i为终点的 入边的数目,称为该顶点的入度。
以顶点为始点的 出边的数目,称为该顶点的出度。
一个顶点的 入度出度的和为该顶点的度。

路径

在一个图G=(V, E)中,从顶点i到顶点j的一条路径是一个顶点序列(i,i1,i2,…im,j)
若此图G是无向图,则边(i,i1),(i1,i2), … (im-1 ,im), (im,j)属于E(G);
若此图是有向图,则<i,i1>,<i1,i2>, … <im-1 ,im>, <im,j>属于E(G)。

路径长度

非带权图的路径长度是指此路径上边的条数。

带权图的路径长度是指路径上各边的权之和。

在这里插入图片描述

连通图与连通分量

无向图G中,若从顶点i到顶点j有路径,则称顶点i和j是连通的。

无向图G中任意两个顶点都连通,则称G为连通图,否则称为非连通图

无向图G中的极大连通子图称为G的连通分量

任何连通图的连通分量只有一个,即本身;
非连通图有多个连通分量。
强连通图与强连通分量

有向图G中,若从顶点i到顶点j有路径,则称从顶点到j是连通的。

有向图G中的任意两个顶点i和j都连通,则称图G是强连通图。
有向图G中的极大强连通子图称为G的强连通分量。

强连通图只有一个强连通分量,即本身; 非强连通图有多个强连通分量。

存储结构一 邻接矩阵

建立一个顶点表(记录各个顶点信息)和一个邻接矩阵(表示各个顶点之间关系)。
设图A=(V, E)有n个顶点,则图的邻接矩阵是一个二维数组,定义为:

在这里插入图片描述

有边1,无边0

在这里插入图片描述

ps:(1)无向图的邻接矩阵是对称的;

(2)顶点i的度=第i行(列)中1的个数;

完全图的邻接矩阵中,对角元素为0,其余1

在这里插入图片描述

ps:(1)有向图的邻接矩阵可能是不对称的;

(2)顶点的出度=第i行元素之和,顶点的入度=第i列元素之和;顶点的度=第i行元素之和+第i列元素之和。

完全图的邻接矩阵中,对角元素为0,其余1。

在这里插入图片描述

构造算法

在这里插入图片描述

在这里插入图片描述

调用函数

int LocateVex(MGraph G,VetexType u)
{//存在则返回u在顶点表中的下标;否则返回-1
    int i;
    for(i=0;i<G.vexnum;++i)
        if(u==G.vexs[i])
            return i;
    renturn-1;
}

特点

图的邻接矩阵表示是唯一的

邻接矩阵的存储
无向图的邻接矩阵一定是一个对称矩阵,可以考虑压缩存储。
不少邻接矩阵是一个稀疏矩阵, 当图的顶点较多时,可以采用三元组表的方法存储。

顶点的度
对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的度。
对于有向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的出度(或入度)。

优点

容易实现图的操作,如:求某顶点的度、判断顶点之间是否有边(弧)、找顶点的邻接点等等。

缺点

n个顶点需要n*n个单元存储边(弧);空间效率为O(n2)。

适用范围

对稀疏图而言浪费空间,适合稠密图。

存储结构二 邻接表

顺序分配与链式分配相结合;
对每个顶点vi建立一个单链表,把与vi有关联的边的信息(即入度或出度边)链接起来,表中每个结点都设有2个域;

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

ps:(1)无向图的邻接表是不唯一的;
(2)顶点i的度=第i个链表中结点的个数;
(3)空间效率为O(n+2e),若稀疏图(e<<n2),比邻接矩阵O(n2)省空间。

在这里插入图片描述

ps:(1)除了n个头结点外,只有e个表结点,空间效率为O(n+e)。若是稀疏图,则比邻接矩阵合适。
(2)出度OD(Vi)=邻接表中链接的结点数;
(3)入度ID(Vi)= =逆邻接表中链接的结点数。

在这里插入图片描述

ps:当邻接表的存储结构形成后,图便唯-一确定

构造算法

在这里插入图片描述

在这里插入图片描述

特点

对邻接矩阵的一种改进
邻接表表示不唯一:

在每个顶点对应的单链表中,各边节点的链接次序可以是任意的。

无向图
对于有n个顶点和e条边的无向图,其邻接表有n个顶点节点和2e个边节点,空间效率为O(n+2e)
若是稀疏图(e<<n2),则比邻接矩阵表示0(n2)省空间。

有向图
邻接表中除了n个头结点外,只有e个表结点,空间效率为O(n+e)。
若是稀疏图,则比邻接矩阵合适。

有向图顶点的出度

OD(Vi)=单链出边表中链接的结点数

有向图顶点的入度

ID(Vi)=逆邻接表中链接的结点数

优点

容易寻找顶点的邻接点;

缺点

判断两顶点间是否有边或弧,需搜索两顶点对应的单链表,没有邻接矩阵方便;

适用范围

适合稀疏图;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值