第七章 图

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
vertex firstin firstout
顶点结点结构
顶点值域 指针域 指针域
tailvex headvex hlink
tlink
info
弧结点结构
弧尾结点 弧头结点 指针域 指针域 弧上信息
A B
C
在十字链表中容易求 得顶点的出度和入度
0 A
0 1

2 0∧∧
1 B 2 C
2 1∧
0 2∧∧
图的遍历方法有两种: 深度优先搜索和广度优先搜索
7.3.1 深度优先搜索
按照深度方向搜索 ,它类似于树的先根遍历。 深度优先算法的基本思想是: (1)从图中某个顶点v0出发,首先访问v0。 (2)找出刚访问过的顶点vi的第一个未被访问 的邻接点,然后访问该顶点。重复此步骤,直 到当前的顶点没有未被访问的邻接点为止。 (3)返回前一个访问过的顶点,找出该顶点的 下一个未被访问的邻接点,访问该顶点。转2。
一、图的数组(邻接矩阵)存储表示 二、图的邻接表存储表示
三、有向图的十字链表存储表示 四、无向图的邻接多重表存储表示
一、图的数组(邻接矩阵)表示法
所谓邻接矩阵(Adjacency Matrix)的存 储结构,就是用一维数组存储图中顶点的信息, 用矩阵表示图中各顶点之间的邻接关系。假设 图G=(V,E)有n个确定的顶点,即V= {v0,v1,…,vn-1},则表示G中各顶点相邻关系为一 个n×n的矩阵
遍 历
DFSTraverse(G, v, Visit());
//从顶点v起深度优先遍历图G,并对每 //个顶点调用函数Visit一次且仅一次。
BFSTraverse(G, v, Visit());
//从顶点v起广度优先遍历图G,并对每 //个顶点调用函数Visit一次且仅一次。
7.2 图的存储表示
四、无向图的邻接多重表存储表示
邻接多重表(Adjacency Multilist)主要用于存储无向图。因为,如果用邻 接表存储无向图,每条边的两个边结点分别在以该边所依附的两个顶点 为头结点的链表中,这给图的某些操作带来不便。例如,对已访问过的 边做标记,或者要删除图中某一条边等,都需要找到表示同一条边的两 个结点。因此,在进行这一类操作的无向图的问题中采用邻接多重表作 存储结构更为合适 。
// 点”。若 w 是 v 的最后一个邻接点,则 // 返回“空”。
插入或删除顶点
InsertVex(&G, v);
//在图G中增添新顶点v。
DeleteVex(&G, v);
// 删除G中顶点v及其相关的弧。
插入和删除弧
InsertArc(&G, v, w); // 在G中增添弧<v,w>,若G是无向的, //则还增添对称弧<w,v>。 DeleteArc(&G, v, w); //在G中删除弧<v,w>,若G是无向的, //则还删除对称弧<w,v>。
二、图的邻接表存储表示
邻接表(Adjacency List)是图的一种顺序存 储与链式存储结合的存储方法。 邻接表表示法类似于树的孩子链表表示法。 就是对于图G中的每个顶点vi,将所有邻接于vi的 顶点vj链成一个单链表,这个单链表就称为顶点 vi的邻接表,再将所有点的邻接表表头放到数组 中,就构成了图的邻接表。
v0
V0
V2
3 ∧
V1 ∧ v2 0 ∧ 2 1 ∧
V1
V3
v3
在邻接表上容易找到任一顶点的第一个邻 接点和下一个邻接点,但要判定任意两个顶点 (vi 和vj)之间是否有边或弧相连,则需搜索第 i个或第j个链表,因此,不及邻接矩阵方便。
三、有向图的十字链表存储表示
十字链表(Orthogonal List)是有向图的 一种存储方法,它实际上是邻接表与逆邻接表 的结合,即把每一条边的边结点分别组织到以 弧尾顶点为头结点的链表和以弧头顶点为头顶 点的链表中。
顶点值域
vertex
指针域
firstedge 顶点结点结构
标记域
Mark
顶点位置
ivex
指针域
ilink
顶点位置
jvex
指针域
jlink
边上信息
info
边表结点结构
V0
V2
V1
v0 v1
V3
0v3
7.3 图的遍历
从图中某个顶点出发遍历图,访遍图中其 余顶点,并且使图中的每个顶点仅被访问一次 的过程。 为了保证图中的各顶点在遍历过程中访问且 仅访问一次,需要为每个顶点设一个访问标志, 用以标示图中每个顶点是否被访问过,访问标 志用数组visited[n]来表示。
7.1 抽象数据类型图的定义
7.2 图的存储表示
7.3 图的遍历
7.4 最小生成树 7.5 重(双)连通图和关节点
7.6 两点之间的最短路径问题
7.7 拓扑排序
7.8 关键路径
图的结构定义:
图是由一个顶点集 V 和一个弧集 R构成的
数据结构。 Graph = (V, R ) R={VR} 其中,VR={<v,w>| v,w∈V 且 P(v,w)} <v,w>表示从 v 到 w 的一条弧,并称 v 为弧 头,w 为弧尾。 谓词 P(v,w) 定义了弧 <v,w>的意义或信息。
例如: OD(B) = 1 ID(B) = 2
TD(B) = 3
设图G=(V,{VR})中的一个顶点序列 { u=vi,0,vi,1, …, vi,m=w}中,(vi,j-1,vi,j)VR 1≤j≤m, 则称从顶点u 到顶点w 之间存在一条路径。 路径上边的数目称作路径长度。 如:从A到F长度为 3 简单路径:指序列中顶 的路径{A,B,C,F} 点不重复出现的路径。 A 简单回路:指序列中 B E 第一个顶点和最后一
v3
第i个链表中的结点个数只是顶点vi的出度,为求 入度,必须遍历整个邻接表。在所有链表中其邻接点 域的值为i的结点的个数是顶点vi的入度。 有时,为了便于确定顶点的入度或以顶点vi为头 的弧,可以建立一个有向图的逆邻接表,即对每个顶 点vi 建立一个链接以vi为头的弧的链表。
3)有向图的逆邻接表
C F
个顶点相同的路径。
若图G中任意两个顶 点之间都有路径相通, 则称此图为连通图; A B A
F E
B
C D
C
D
F
E
若无向图为非连通图, 则图中各个极大连通 子图称作此图的连通 分量。
对有向图, 若任意两个顶点之间都存在
一条有向路径,则称此有向图为强连通图。 否则,其各个强连通子图称作它的 强连通分量。 A B E B A E
(2)依次以v0的未被访问的邻接点为出发点, 深度优先搜索图,直至图中所有与v0有路径相 通的顶点都被访问。
由于“弧”是有方向的,因此称由顶点 集和弧集构成的图为有向图。
例如: G1 = (V1, VR1)
A
B C D E 其中 V1={A, B, C, D, E} VR1={<A,B>, <A,E>,
<B,C>, <C,D>, <D,B>, <D,A>, <E,C> }
若<v, w>VR 必有<w, v>VR, 则称 (v,w) 为顶点 v 和顶点 w 之间存在一条边。 例如: G2=(V2,VR2) V2={A, B, C, D, E, F} VR2={(A, B), (A, E),
插入和删除弧
对邻接点的操作
遍历
结构的建立和销毁
CreatGraph(&G, V, VR):
// 按定义(V, VR) 构造图 DestroyGraph(&G):
// 销毁图
对顶点的访问操作
LocateVex(G, u); // 若G中存在顶点u,则返回该顶点在 // 图中“位置” ;否则返回其它信息。 GetVex(G, v); // 返回 v 的值。
A
B C F E
邻接矩阵表示法的特点:
1、求顶点的度很方便 在无向图中:顶点的度数=矩阵中对应该顶点 的行或列中非零元素的个数。 在有向图中:顶点的出度=矩阵中对应该顶点 的行中非零元素的个数。 顶点的入度=矩阵中对应该顶点 的列中非零元素的个数。
邻接矩阵表示法的特点:
2、存储空间:对于无向图而言,它的邻 接矩阵是对称矩阵,所以可采用压缩存储法 (下三角),其存储空间只需n(n-1)/2。但对 于有向图而言,因为它的弧是有方向的,它 的邻接矩阵不一定是对称矩阵,所以需要n2 个存储空间。 注意:稀疏图不适于用邻接矩阵来存储,因 为这样会造成存储空间的浪费。
1 若(vi,vj)或<vi,vj>是E(G)中的边
A[i][j]=
0 若(vi,vj)或<vi,vj>不是E(G)中的边
若G是网图,则邻接矩阵可定义为
A[i][j]=
wij
若(vi,vj)或<vi,vj>是E(G)中的边
0或∞ 若(vi,vj)或<vi,vj>不是E(G)中的边
其中,wi,j表示边(vi,vj)或<vi,vj>上的权值; ∞表示一个计算机允许的、大于所有边上 权值的数。
PutVex(&G, v, value); // 对 v 赋值value。
对邻接点的操作
FirstAdjVex(G, v);
// 返回 v 的“第一个邻接点” 。若该顶点 //在 G 中没有邻接点,则返回“空”。
NextAdjVex(G, v, w); // 返回 v 的(相对于 w 的) “下一个邻接
V1
V3
v3
1
0 ∧
若无向图中有n 个顶点、e条边,则它的邻接表需n 个头结点和2e个表结点。显然,在边稀疏(e<<n(n-1)/2) 的情况下,用邻接表表示图比邻接矩阵节省存储空间, 顶点vi的度恰为第i个链表中的结点数
2)有向图的邻接表
v0
V0
V2
2 ∧ 3 ∧ 3 ∧ 0 ∧
v1 v2
V1
V3
Aij=
{ 1 (i,j)VR
C D
0 1 0 0 1 0 1 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 1 0 0
0 (i,j)VR
B A F
E
有向图的邻接矩阵 为非对称矩阵
0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0
(B, E), (C, D), (D, F), (B, F), (C, F) }
由顶点集和边 集构成的图称 作无向图。
B A F
C D E
名词和术语
网、子图
完全图、稀疏图、稠密图
邻接点、度、入度、出度 路径、路径长度、简单路径、简单回路
连通图、连通分量、 强连通图、强连通分量 生成树、生成森林
15
A
21
2
9 11
弧或边带权的图
B
3
7
E
分别称作有向网或 无向网。
C
F B A E C
设图G=(V,{VR}) 和 图 G=(V,{VR}), B 且 VV, VRVR, 则称 G 为 G 的子图。
F
假设图中有 n 个顶点,e 条边,则
含有 e=n(n-1)/2 条边的无向图称作 完全图; 含有 e=n(n-1) 条弧的有向图称作 有向完全图; 若边或弧的个数 e<nlogn,则称作 稀疏图,否则称作稠密图。
一个n个顶点的图的邻接表表示由表头结点表与 边表两部分构成。
头结点结构为: data firstarc
指向链表的第一个结点
顶点的数据元素的值
表结点结构为:
adjvex
nextarc
info
邻接点域(位置) 指向下一条边(或弧)
1)无向图
V0 V2
v0 v1 v2 3 3 0 ∧ 2 0 ∧ 1 ∧
C
F
C
F
假设一个连通图有 n 个顶点和 e 条边, 其中 n-1 条边和 n 个顶点构成一个极小 连通子图,称该极小连通子图为此连通图 的生成树。 B A F E C D
对非连通图,则称 由各个连通分量的 生成树的集合为此 非连通图的生成森 林。
基本操作
结构的建立和销毁 对顶点的访问操作
插入或删除顶点
例如:
0 1
a
2 3 4
b
5
6
g f
c
7
d
e
8
h
0 1
k
2 3 4 5 6 7 8
访问标志: F F F F F F F F F T T T T T T T T T 访问次序:
a c h d k f e b g
采用递归的形式说明,则深度优先搜索连通 子图的的基本思想可表示为: (1)访问出发点v0。
假若顶点v 和顶点w 之间存在一条边, 则称顶点v 和w 互为邻接点
边(v,w) 和顶点v 和w 相关联。 和顶点v 关联的边的数目定义为边的度。
例如: 右侧图中
TD(B) = 3 TD(A) = 2
B
C
A F E
D
对有向图来说,由于弧有方向性,则
A
有入度和出度之分
B
C F
E
顶点的出度: 以顶点 v 为弧尾的弧的数目; 顶点的入度: 以顶点v 为弧头的弧的数目。 顶点的度(TD)= 出度(OD)+入度(ID)
相关文档
最新文档