数据结构学习笔记——第6章 图

6 图

6.1 图的基本概念

6.1.1 图的定义

  • 图 G 由顶点集 V 和边集 E 组成,记为 G = ( V , E ) G=(V, E) G=(V,E),其中 V(G) 表示图 G 中顶点的有限非空集;E(G) 表示图 G 中顶点之间的关系(边)的集合
  • V = { v 1 , v 2 , . . . , v n } V = \{ v_1, v_2, ..., v_n \} V={ v1,v2,...,vn},则用 ∣ V ∣ | V | V 表示图 G 中顶点的个数,也称图 G 的 E = { ( u , v ) ∣ u ∈ V , v ∈ V } E = \{ ( u,v ) | u \in V, v \in V \} E={ (u,v)uV,vV},用 ∣ E ∣ | E | E 表示图 G 中边的条数
  • 线性表、树都可以为空,但图不能为空
  • 有向图
    • 若 E 是有向边(也称)的有限集合,则图 G 为有向图
    • 弧是顶点的有序对,记为 ⟨ v , w ⟩ \left \langle v,w \right \rangle v,w,其中 v, w 是顶点,v 称为弧尾,w称为弧头 ⟨ v , w ⟩ \left \langle v,w \right \rangle v,w 称为从顶点 v 到顶点 w 的弧,也称 v 邻接到 w,或 w 邻接自 v
  • 无向图
    • 若 E 是无向边(简称)的有限集合,则图 G 为无向图
    • 边是顶点的无序对,记为 ( v , w ) ( v,w ) (v,w) ( w , v ) ( w,v ) (w,v),因为 ( v , w ) = ( w , v ) ( v,w )=( w,v ) (v,w)=(w,v),其中 v, w 是顶点,可以说顶点 w 和顶点 v 互为邻接点,边 ( v , w ) ( v,w ) (v,w) 依附于顶点 w 和 v,或者说边 ( v , w ) ( v,w ) (v,w) 和顶点 w, v 相关联
  • 简单图
    • 一个图 G 若满足:① 不存在重复边;② 不存在顶点到自身的边,则称图 G 为简单图
    • 数据结构中仅讨论简单图
  • 多重图
    • 若图 G 中某两个点之间的边数多于一条,又允许顶点通过同一条边和自己关联,则 G 为多重图
  • 完全图(也称简单完全图)
    • 对于无向图, ∣ E ∣ | E | E 的取值范围是 0 0 0 n ( n − 1 ) / 2 n(n-1)/2 n(n1)/2,有 n ( n − 1 ) / 2 n(n-1)/2 n(n1)/2 条边的无向图称为无向完全图,在完全图中任意两个顶点之间都存在边
    • 对于有向图, ∣ E ∣ | E | E 的取值范围是 0 0 0 n ( n − 1 ) n(n-1) n(n1),有 n ( n − 1 ) n(n-1) n(n1) 条边的无向图称为有向完全图,在有向完全图中任意两个顶点之间都存在方向相反的两条弧
  • 子图
    • 设有两个图 G = ( V , E ) G=(V, E) G=(V,E) G ′ = ( V , ′ E ′ ) G'=(V,' E') G=(V,E),若 V ′ V' V V V V 的子集,若 E ′ E' E E E E 的子集,则称 G ′ G' G G G G子图
    • 若有满足 V ′ ( G ) = V ( G ) V'(G) = V(G) V(G)=V(G) 的子图 G ′ G' G ,则称其为 G G G生成子图
  • 连通、连通图和连通分量
    • 无向图中,若从顶点 v 到顶点 w 有路径存在,则称 v 和 w 是连通
    • 若图 G 中任意两个顶点都是连通的,则称图 G 为连通图,否则称为非连通图
    • 无向图中的极大连通子图称为连通分量
    • n 个顶点的连通图最少有 n-1 条边
  • 强连通图、强连通分量
    • 有向图中,若从顶点 v 到顶点 w 和顶点 w 到顶点 v之间都有路径,则称这两个顶点是强连通
    • 若图中任何一对顶点都是强连通的,则称此图为强连通图
    • 有向图中的极大强连通子图称为有向图的强连通分量
    • n 个顶点的连通图最少有 n 条边
  • 生成树、生成森林
    • 连通图的生成树是包含图中全部顶点的一个极小连通子图
    • 若图中顶点数为 n,则它的生成树含有 n-1 条边
    • 对生成树而言,若砍去它的一条边,则会变成非连通图,若加上一条边则会变形成一个回路
    • 在非连通图中,连通分量的生成树构成了非连通图的生成森林
  • 顶点的度、入度和出度
    • 图中每个顶点的定义为以该顶点为一个端点的边的数目
    • 对于无向图,顶点 v 的是指依附于该顶点的边的条数,记为 TD(v)
    • 在具有 n 个顶点、e 条边的无向图中, ∑ i = 1 n T D ( v i ) = 2 e \sum_{i=1}^{n}TD(v_i) = 2e i=1nTD(vi)=2e,即无向图的全部顶点的度的和等于边数的两倍,因为每条边和两个顶点相关联
    • 对于有向图,顶点 v 的度分为入度出度,入度是以顶点 v 为终点的有向边的数目,记为 I D ( v ) ID(v) ID(v);而出度是以顶点 v 为起点的有向边的条数,记为 O D ( v ) OD(v) OD(v)。顶点 v 的度等于其入度和出度之和,即 T D ( v ) = I D ( v ) + O D ( v ) TD(v) = ID(v) + OD(v) TD(v)=ID(v)+OD(v)
    • 在具有 n 个顶点、e 条边的无向图中, ∑ i = 1 n I D ( v i ) = ∑ i = 1 n O D ( v i ) = e \sum_{i=1}^{n}ID(v_i) = \sum_{i=1}^{n}OD(v_i) = e i=1nID(vi)=i=1nOD(vi)=e,即有向图的全部顶点的入度之和与出度之和相等,并且等于边数。这是因为每条有向边都有一个起点和终点
  • 边的权和网
    • 在一个图中,每条边都可以标上具有某种含义的数值,该数值称为该边的权值
    • 这种边上带有权值的图称为带权图,也称
  • 稠密图、稀疏图
    • 边数很少的图称为稀疏图,反之称为稠密图。稀疏和稠密本身是模糊的概念,稀疏图和稠密图常常是相对而言的
    • 一般当图 G 满足 ∣ E ∣ < ∣ V ∣ l o g ∣ V ∣ |E| < |V| log|V| E<VlogV 时,可以将 G 视为稀疏图
  • 路径、路径长度和回路
    • 顶点 v p v_p vp 到顶点 v q v_q vq 之间的一条路径是指顶点序列 v p , v i 1 , v i 2 , . . . , v i m , v q v_p, v_{i_1}, v_{i_2}, ..., v_{i_m}, v_q vp,vi1,vi2,...,vim,vq,当然,关联的边也可以理解为路径的构成要素
    • 路径上边的数目称为路径长度
    • 第一个顶点和最后一个顶点相同的路径称为回路
    • 若一个图有 n 个顶点,并且有大于 n-1 条边,则此图一定有环
  • 简单路径、简单回路
    • 在路径序列中,定点不重复出现的路径称为简单路径
    • 除第一个顶点和最后一个顶点外,其余顶点不重复出现的回路称为简单回路
  • 距离
    • 从顶点 u 出发到顶点 v 的最短路径若存在,则此路径的长度称为从 u 到 v 的距离
    • 若从顶点 u 到顶点 v 根本不存在路径,则记该距离为无穷( ∞ \infty
  • 有向树
    • 一个顶点的入度为 0、其余顶点的入度均为 1 的有向图,称为有向树

6.2 图的存储及基本操作

6.2.1 邻接矩阵法

  • 所谓邻接矩阵存储,是指用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息(即可顶点直接的邻接关系),存储顶点直接邻接关系的二维数组称为邻接矩阵
  • 结点数为 n n n 的图 G = ( V , E ) G = (V, E) G=(V,E) 的邻接矩阵 A A A n × n n×n n×n 的。将 G G G 的顶点编号为 v 1 , v 2 , . . . , v n v_1, v_2, ..., v_n v1,v2,...,vn。若 ( v i , v j ) ∈ E (v_i, v_j) \in E (vi,vj)E,则 A [ i ] [ j ] = 1 A[i][j] = 1 A[i][j]=1,否则 A [ i ] [ j ] = 0 A[i][j] = 0 A[i][j]=0
  • A [ i ] [ j ] = { 1 , 若 ( v i , v j ) 或 ⟨ v i , v j ⟩ 是 E ( G ) 中 的 边 0 , 若 ( v i , v j ) 或 ⟨ v i , v j ⟩ 不 是 E ( G ) 中 的 边 A[i][j] = \begin{cases} 1,若(v_i,v_j)或\left \langle v_i,v_j \right \rangle是E(G)中的边 \\ 0,若(v_i,v_j)或\left \langle v_i,v_j \right \rangle不是E(G)中的边\end{cases} A[i][j]={ 1(vi,vj)vi,vjE(G)0(vi,vj)vi,vjE(G)
  • 对于带权图而言,若顶点 v i v_i vi v j v_j vj 之间有边相连,则邻接矩阵中对应项存放着该边对应的权值,若顶点 v i v_i vi v j v_j vj 不相连,则用 ∞ \infty 来代表这两个顶点之间不存在边
  • A [ i ] [ j ] = { w i j , 若 ( v i , v j ) 或 ⟨ v i , v j ⟩ 是 E ( G ) 中 的 边 0 或 ∞ , 若 ( v i , v j ) 或 ⟨ v i , v j ⟩ 不 是 E ( G ) 中 的 边 A[i][j] = \begin{cases} w_{ij},若(v_i,v_j)或\left \langle v_i,v_j \right \rangle是E(G)中的边 \\ 0或\infty,若(v_i,v_j)或\left \langle v_i,v_j \right \rangle不是E(G)中的边\end{cases} A[i][j]={ wij(vi,vj)vi,vjE(G)0(vi,vj)vi,vjE(G)
    邻接矩阵法
#define MaxVertexNum 100                            //顶点数目的最大值
typedef char VertexType;                            //顶点的数据类型
typedef int EdgeType;                               //带权图中边上权值的数据类型
typedef struct {
   
   
	VertexType Vex[MaxVertexNum];                   //顶点表
	EdgeType Edge[MaxVertexNum][MaxVertexNum];      //邻接矩阵,边表
	int vexnum, arcnum;                             //图的当前顶点数和弧数
}MGraph
  • 注意
    • ① 在简单应用中,可直接用二维数组作为图的邻接矩阵(顶点信息等均可省略)
    • ② 当邻接矩阵中的元素仅表示相应的边是否存在时,EdgeType可定义为值为 0 和 1 的枚举类型
    • ③ 无向图的邻接矩阵是对称矩阵,对规模特大的邻接矩阵可采用压缩存储
    • ④ 邻接矩阵表示法的空间复杂度为 O ( n 2 ) O(n^2) O(n2),其中 n n n 为图的顶点数 ∣ V ∣ |V| V
  • 特点
    • 无向图的邻接矩阵一定是一个对称矩阵(并且唯一)。因此,在实际存储邻接矩阵时只需存储上(或下)三角矩阵的元素
    • ② 对于无向图,邻接矩阵的第 i i i 行(或第 i i i 列)非零元素(或非 ∞ \infty 元素)的个数正好是第 i i i 个顶点的 T D ( v i ) TD(v_i)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值