数据结构——图(c)

数据结构——图(c)


一、基本概念和术语

1.图

图G由顶点集V和边集E组成,记为G=(V,E),其中:
 ①V(G) 表示图G中顶点的有限非空集,V={v1, v2s … , }
  用 |V| 表示图G中顶点的个数,也称图G的阶
 ②E(G) 表示图G中顶点之间的关系(边)集合,E={(u, v) | u∈V, v∈V}
  用 |E| 表示图G中边的条数。

图G是顶点集V和边集E组成的二元组G=<V,E>,E中每条边是V中一对顶点 (u, v) 间的联系。

邻接点 (边的两个顶点互为邻接点)
关联边 (若有边e= (v, u),则称顶点v、u关联边e)

注意:线性表可以是空表,树可以是空树,但图不可以是空,即V一定是非空集,但E可以是空集。

2.图的分类

(1)无向图、有向图
若E是无向边(简称边)的有限集合时,则图G为无向图
  ①边是顶点的无序对,记为(v, w)或(w, v),因为(v, w)= (w, v),其中v、w是顶点。
  ②可以说顶点w和顶点v互为邻接点,边(v, w)依附于顶点w和v,或者说边(v, w)和顶点v、w相关联。

若E是有向边(也称弧)的有限集合时,则图G为有向图
  ①弧是顶点的有序对,记为<v, w>,其中v、w是顶点,v称为弧尾,w称为弧头。
  ②<v, w>称为从顶点v到顶点w的弧,也称v邻接到w,或w邻接自v。
  ③<v, w>≠<w, v>

(2)简单图、多重图
简单图:①不存在重复边;②不存在顶点到自身的边。
多重图:图G中某两个结点之间的边数多于一条,又允许顶点通过同一条边和自己关联,则G为多重图
注:也分有向、无向

3.相关定义

(1)顶点的度

  1. 在无向图中:顶点V的 = 与V相关联的边的数目 TD(v)
    无向图的全部顶点的度的和等于边数的2倍, ∑ i = 1 n T D ( v i ) = 2 e \displaystyle \sum_{i=1}^n TD(v_i)=2e i=1nTD(vi)=2e
  2. 在有向图中:
    (1)顶点V的出度 = 以V为起点有向边数 OD(v)
    (2)顶点V的入度 = 以V为终点有向边数 ID(v)
    (3)顶点V的 = V的出度+V的入度 TD(v)=ID(v)+OD(v)
    (4)在具有n个顶点、e条边的有向图中, ∑ i = 1 n I D ( v i ) = ∑ i = 1 n O D ( v i ) = e \displaystyle \sum_{i=1}^n ID(v_i)=\sum_{i=1}^n OD(v_i)=e i=1nID(vi)=i=1nOD(vi)=e
  3. 设图G的顶点数为n,边数为e:图的所有顶点的度数之和 = 2×e

(2)顶点-顶点的关系描述
路径:在图G=<V, E>中,若有顶点序列 v 1 \displaystyle v_1 v1, v 2 \displaystyle v_2 v2, … , v k \displaystyle v_k vk,且<vi, vi+1>∈E(有向图)或< v i \displaystyle v_i vi, v i + 1 \displaystyle v_{i+1} vi+1>∈E(无向图),其中i=1,2, … ,k-1,v = v 1 \displaystyle v_1 v1, u = v k \displaystyle v_k vk,则称该序列是从顶点v到顶点u的路径,若v=u,则称该序列为回路或环。
回路:第一个顶点和最后一个顶点相同的路径称为回路或环。
简单路径:在一条路径中,除起点和终点外,若其余顶点各不相同,则称该路径为简单路径。
简单回路:除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路。
路径长度:路径上边的数目。
点到点的距离:从顶点u出发到顶点v的最短路径若存在,则此路径的长度称为从u到v的距离。
  若从u到v根本不存在路径,则记该距离为无穷(∞)。
连通:无向图中,若从顶点v到顶点w有路径存在,则称v和w是连通的。
强连通:有向图中,若从顶点v到顶点w和从顶点w到顶点v之间都有路径,则称这两个顶点是强连通的。

(3)连通图、强连通图、连通分量、强连通分量
连通图:在无向图 G=<V, E>中,若对任何两个顶点都是连通的,则称G是连通图,否则称为非连通图。
  连通分量:无向图中的极大连通子图。
  若G是连通图,则最少有n-1条边
  若G是非连通图,则最多可能有 C n − 1 2 C^2_{n-1} Cn12条边
强连通图:在有向图G=<V, E>中,若对任何两个顶点u,v都存在从u到v的路径,则称G是强连通图。
  强连通分量:有向图中的极大强连通子图。
  若G是强连通图,则最少有n条边(形成回路)

(4)研究图的局部——子图
子图:设有两个图G= (V,E)和G’= (v’ , E’),若V’是V的子集,且E’是E的子集,则称G’是G的子图。
生成子图:若有满足V(G’) = V(G)的子图G’,则称其为G的生成子图。(即在,原图的基础上,去掉了某些边)

(5)生成树、生成森林
生成树:(针对无向图)(保证连通,边数最少)
一个连通图的生成树是一个极小连通分量子图,它含有图中全部n个顶点,但只有足以构成一棵树的n-1条边
  对生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会形成一个回路。
生成森林
在非连通图中,连通分量的生成树构成了非连通图的生成森林。

(6)边的权、带权图/网
边的权:在一个图中,每条边都可以标上具有某种含义的数值,该数值称为该边的权值。
带权图/网:边上带有权值的图称为带权图,也称网。
带权路径长度:当图是带权图时,一条路径上所有边的权值之和,称为该路径的带权路径长度。

4.几种特殊形态的图

①完全图 :
无向完全图:无向图中任意两个顶点之间都存在边,共 C n 2 C^2_n Cn2条。
  若无向图的顶点数|V|=n,则 ∣ E ∣ ∈ [ 0 , C n 2 ] = [ 0 , n ( n − 1 ) / 2 ] |E|∈[0,C^2_n]=[0,n(n-1)/2] E[0,Cn2]=[0,n(n1)/2]
有向完全图:有向图中任意两个顶点之间都存在方向相反的两条弧,共 2 C n 2 2C^2_n 2Cn2条。
  若有向图的顶点数IVI=n,则 ∣ E ∣ ∈ [ 0 , 2 C n 2 ] = [ 0 , n ( n − 1 ) ] |E|∈[0,2C^2_n]=[0,n(n-1)] E[0,2Cn2]=[0,n(n1)]

②稀疏图:边数很少的图称为稀疏图,反之称为稠密图
③稠密图

④树:不存在回路,且连通的无向图。(n个顶点,n-1条边)
  n个顶点的图,若|E|>n-1,则一定有回路。
⑤有向树:一个顶点的入度为0、其余顶点的入度均为1的有向图,称为有向树。
  注:有向树不是强连通图。

二、图的存储结构

图的存储结构至少保存两类信息:
①顶点的数据
②顶点间的关系

约定:G = <V, E>是图,V={ v 1 \displaystyle v_1 v1, v 2 \displaystyle v_2 v2, … , v n − 1 \displaystyle v_{n-1} vn1},设顶点的角标为它的编号。

1.邻接矩阵(顺序存储)

数组实现的顺序存储,空间复杂度高,不适合存储稀疏图。
(1)邻接矩阵表示顶点间的关系。(有向图与无向图不同)
A[ i ] [ j ] = 1 顶点 v i \displaystyle v_i vi v j \displaystyle v_j vj间有边(弧)
A[ i ] [ j ] = 0 顶点 v i \displaystyle v_i vi v j \displaystyle v_j vj间无边(弧)

#define MaxVnum 50;
typedef double AdjMaxtrix[MaxVnum, MaxVnum];

typedef struct{
   
	int vexnum, arcnum; //图的当前顶点数和边(弧)数
	char Vex[MaxVnum]; //定点表
	AdjMatrix arcs; //邻接矩阵,边表
}Graph;

(2)特点:
①无向图的邻接矩阵是对称矩阵,同一条边表示了两次:
  顶点v的度:等于二维数组对应行(或列)中值为1 的元素个数 O(n)、O(|V|)
  判断两顶点v,u是否为邻接点:只需判二维数组对应的分量是否为1
  顶点不变,在图中增加、删除边:只需对二维数组对应分量赋值1或0
  设图中的顶点数为n,用有n个元素的一维数组存储图的顶点,用邻接矩阵表示,则G占用的存储空间为: n + n 2 n+n^2 n+n2。(图的存储空间的占用量只与它的顶点数有关,与边数无关适用于边稠密的图)
②有向图的邻接矩阵不一定是对称的:
  顶点v的出度:等于二维数组对应行值为1的元素个数
  顶点v的入度:等于二维数组对应列值为1的元素个数
  顶点v的度:等于二维数组对应行值为1和对应列值为1的元素个数之和 O(n)、O(|V|)

(3) 邻接矩阵存储 带权图(网)
设定当邻接矩阵中值为0或∞时,说明结点之间不存在边(弧)。

#define MaxVertexNum 100 //顶点数目的最大值
#define INFINITY 最大的int//宏定义常量"无穷"
typedef 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值