大话数据结构(六)---图的简介

目录

第一章 图的定义

1.1 各种图定义

1.2 图的顶点与边间关系

1.3 连通图

第二章 图的存储结构

2.1 邻接矩阵

2.1.1 无向图

2.1.2 有向图

2.2 邻接表

2.2.1 邻接表的处理方法:

2.3 十字链表(链边)

2.3.1 画法

2.5 边集数组


第一章 图的定义

图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通过表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合(有穷非空),E是图G中边的集合(可以为空)

图是一种较线性表和树更加复杂的数据结构,在图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关

1.1 各种图定义

  • 无向边: 若顶点vivi到vjvj之间的边没有方向,则称这条边为无向边(Edge),用无序偶对(vivi,vjvj)来表示,如果图中任意两个顶点之间的边都是无向边,则称该图为无向图(Undirected graphs)
  • 有向边: 若从顶点vivi到vjvj的边有方向,则称这条边为有向边,也称为弧(Arc),用有序偶来表示,vivi称为弧尾(Tail),vjvj称为弧头(Head)。
  • 有向图:如果图中任意两个顶点之间的边都是有向边,则称该图为有向图(Directed graphs)
  • 简单图:在图中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图
  • 无向完全图:在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图,含有n个顶点的无向完全图有n×(n−1)2n×(n−1)2条边
  • 有向完全图:在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图,含有n个顶点的有向完全图有nx(n-1)条边
  • 网:有些图的边或弧具有与它相关的数字,这种与图的边或弧相关的数叫做权(Weight),这种带权的图通常称为网(Network)
  • 子图:假设有两个图G=(V,{E})和G’=(V’,{E’}),如果V’∈V且E’∈E,则称G’为G的子图(Subgraph)

1.2 图的顶点与边间关系

对于无向图G=(V,{E}),如果边(v,v’)∈E,则称顶点v和v’互为邻接点(Adjacent),即v和v’相邻接,边(v,v’)依附(incident)于顶点v和v’,或者说(v,v’)与顶点v和v’相关联。顶点v的度(Degree)是和v相关联的边的数目,记为TD(v)

对于有向图G=(V,{E}),如果弧∈E,则称顶点v邻接到顶点v’,顶点v’邻接自顶点v。弧和顶点v,v’相关联,以顶点为头的弧的数目称为v的入度(InDegree),记为ID(v),以v为尾的弧的数目称为v的出度(OutDegree),记为OD(v);顶点v的度为TD(v)=ID(v)+OD(v)

路径的长度是路径上的边或弧的数目

第一个顶点到最后一个顶点相同的路径称为回路或环(Cycle),序列中顶点不重复出现的路径称为简单路径,除了第一个顶点和最后一个顶点外,其余顶点不重复出现的回路,称为简单回路或简单环,如下左图为简单环,右图不是简单环

1.3 连通图

在无向图G中,如果从顶点v到顶点v’有路径,则称v和v’是连通的,如果对于图中任意两个顶点vivi、vjvj∈E,vivi和vjvj都是连通的,则称G是连通图(Connected Graph)无向图中的极大连通子图称为连通分量,它强调:

  • 要是子图
  • 子图要是连通的
  • 连通子图含有极大顶点数
  • 具有极大顶点数的连通子图包含依附于这些顶点的所有边

在有向图G中,如果对于每一对vivi、vjvj∈V、vivi≠vjvj,从vivi到vjvj和从vjvj到vivi都存在路径,则称G是强连通图。有向图中的极大强连通子图称做有向图的强连通分量,如下图所示,左图并不是强连通图,右图是强连通图,且是左图的极大强连通子图,即是左图的强连通分量

一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边,如下图

如果一个有向图恰有一个顶点的入度为0(根结点),其余顶点的入度均为1,则是一棵有向树。一个有向图的生成森林由若干棵有向树组成,含有图中全部顶点,但只有足以构成若干棵不相交的有向树的弧,如下图

第二章 图的存储结构

2.1 邻接矩阵

将图分成顶点和边或弧两个结构来存储,顶点不分大小、主次,所以用一个一维数组来存储,而边或弧由于是顶点与顶点之间的关系,所以用二维数组(称为邻接矩阵)来存储

设图G有n个顶点,则邻接矩阵是一个nxn的方阵,定义为:

2.1.1 无向图

无向图的边数组是一个对称矩阵,有了这个矩阵,可以很容易地知道图中的信息,很容易判断任意两顶点是否有边无边

某个顶点的度就是这个顶点vivi在邻接矩阵中第i行(或第i列)的元素之和,如v1v1的度就是1+0+1+0=2,求顶点vivi的所有邻接点就是将矩阵中第i行元素扫描一遍,arc[i][j]为1就是邻接点

2.1.2 有向图

有向图的边数组不是一个对称矩阵,有向图样例如下

网图是每条边上带有权的图,设图G是网图,有n个顶点,则邻接矩阵是一个nxn的方阵,定义为:

这里WijWij表示(vivi,vjvj)或上的权值,∞表示一个计算机允许的、大于所有边上权值的值,也就是一个不可能的极限值

缺点: 对于边数相对于顶点较少的图,这种结构是对存储空间的极大浪费

2.2 邻接表

数组与链表相结合的存储方法称为邻接表(Adjacency List)

2.2.1 邻接表的处理方法:

图中顶点用一个一维数组存储,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。图中每个顶点vivi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vivi的边表,有向图则称为顶点vivi作为弧尾的出边表

对于带权值的网图,可以在边表结点定义中再增加一个weight的数据域,存储权值信息

缺点: 对于有向图来说,邻接表关心了出度问题,想了解入度就必须要遍历整个图才能知道,反之,逆邻接表解决了入度却不了解出度的情况

2.3 十字链表(链边)

把邻接表与逆邻接表结合起来就组成了十字链表(Orthogonal List)

  • 入弧和出弧:入弧表示图中发出箭头的顶点,出弧表示箭头指向的顶点
  • 弧头和弧尾:弧尾表示图中发出箭头的顶点,弧头表示箭头指向的顶点
  • 同弧头和同弧尾:同弧头,弧头相同弧尾不同;同弧尾,弧头不同弧尾相同

顶点表结点结构如下表所示

data

firstin

firstout

其中firstin表示入边表头指针,指向该顶点的入边表中第一个结点,firstout表示出边表头指针,指向该顶点的出边表中的第一个结点

边表结点结构如下表所示

tailvex

headvex

headlink

taillink

其中:

       tailvex是指弧起点在顶点表的下标,

       headvex是指弧终点在顶点表中的下标,

       headlink是指入边表指针域,指向终点相同的下一条边,

       taillink是指边表指针域,指向起点相同的下一条边

2.3.1 画法

 1. 列出图的所有顶点,并进行编号:即变表节点

2. 画出各行对应的顶点表示出弧的所有关系

左半部分为顶点表,表示该顶点所有的出弧边,例如:V1的出弧边有(1,0) (1,2),为了方便之后的连线,可以将弧尾相同的画在同一行将弧头相同的画同一列

3. 连线
1. 顶点的出弧
      出弧指向同一行的第一个结点
     入弧指向列号等于其编号的那一列的第一个结点
2. 右侧的四格方格
     同弧头指向本列后序结点,同弧尾指向本行后序结点
     若出弧或同弧尾右边没有方格,则为空

备注:

如V0为例,V0的入弧链表可以查找到所有的入弧顶点,V0的出弧链表可以查找到所有的入弧顶点

2.4 邻接多重表

在无向图的应用中,如果关注的重点是顶点,那么邻接表是不错的选择,但如果更关注边的操作,比如对已访问过的边做标记,删除某一条边等操作,就意味着,需要找到这条边的两个边表结点进行操作,这还是比较繁琐的

2.5 边集数组

边集数组是由两个一维数组构成,一个是存储顶点的信息;另一个是存储边的信息,这个边数组每个数据元素由一条边的起点下标(begin)、终点下标(end)和权(weight)组成

边集数组关注的是边的集合,在边集数组中要查找一个顶点的度需要扫描整个边数组,效率并不高,因此它更适合对边依次进行处理操作,而不适合对顶点相关的操作

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值