图以及最小生成树和最短路径

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

图的连通 在无向图G中,若两个顶点vi和vj之间有
路径存在,则称vi 和vj 是连通的。若G中任意两 个顶点都是连通的,则称G为连通图。非连通图的 极大连通子图叫做连通分量。

强连通图与强连通分量 在有向图中, 若对于每一 对顶点vi和vj, 都存在一条从vi到vj和从vj到vi的路径, 则称此图是强连通图。非强连通图的极大强连通 子图叫做强连通分量。
顶点结点 Data firstin firstout 弧结点 tailvex headvex info hlink tlink
图9-12 十字链表结点结构
◆ data域:存储和顶点相关的信息;
◆ 指针域firstin:指向以该顶点为弧头的第一条弧 所对应的弧结点;
◆ 指针域firstout:指向以该顶点为弧尾的第一条 弧所对应的弧结点; ◆ 尾域tailvex:指示弧尾顶点在图中的位置;
a
2 6 3 1

b 3
4 5
e
c
d
(a) 带权无向图
vexs a b c d e
∞ 6 2 ∞ ∞
6 2 ∞ ∞ 3 4 3 ∞ 1 4 3 ∞ 3 ∞ 5
∞ 3 ∞ 5 ∞
(b) 顶点矩阵 (c) 邻接矩阵 图9-6 无向带权图的数组存储
(3) 无向图邻接矩阵的特性
◆ 邻接矩阵是对称方阵; ◆ 对于顶点vi,其度数是第i行的非0元素的个数;
(b) 顶点矩阵
0 1 1 1
1 0 1 1
1 1 0 1
1 1 1 0
(a) 无向图
(c) 邻接矩阵
图9-5 无向无权图的数组存储
(2) 带权图的邻接矩阵
无向带权图G=(V,E) 的邻接矩阵如图9-6所示。其 元素的定义如下: Wij 若(vi , vj)E,即vi , vj邻接,权值为wij A[i][j]= ∞ 若(vi , vj)E,即vi , vj不邻接时
0 2 5 (b) 6
0 1 2 (c)
0
1
2 (d)
3
•子图 设有两个图 G=(V, E) 和 G‘=(V’, E‘)。若 V’ V 且 E‘E, 则称 图G’ 是 图G 的子图。 • 路径 在图G=(V, E)中,若从结点vi出发有一组边使 可到达结点vj,则称结点vi到结点vj的结点序列为从 结点vi到结点vj的路径 简单路径和回路 若路径上各结点v1, v2, …, vm,互 不重复,则称这样的路径为简单路径;若路径上第 一个结点v1与最后一个结点vm重合,则称这样的路 径为回路或环。
(a) 带权有向图
(c) 邻接矩阵
图9-8 带权有向图的数组存储
⑶ 有向图邻接矩阵的特性
◆ 对于顶点vi,第i行的非0元素的个数是其出度 OD(vi);第i列的非0元素的个数是其入度ID(vi) 。
◆ 邻接矩阵中非0元素的个数就是图的弧的数目。
练习1
2
1 3 5 4
0 1 arcs 1 1 1
1 1 1 1 0 0 1 0 0 0 0 1 1 0 0 0 0 1 0 0
1 2 vexs 3 4 5
练习2
B
A C E D
0 0 arcs 0 0 0
1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
wij 若<vi,vj>E,即vi , vj邻接,权值为wij
A[i][j]= ∞ 若<vi,vj>E,即vi , vj不邻接时
a 6
2 3 1
b 3
4 5
e
c
d
vexs a b c d e
(b) 顶点矩阵
∞ ∞ ∞ ∞ ∞
6 2 ∞∞ 3 ∞ 4 ∞ ∞∞
∞ ∞ ∞ 3 1 ∞ ∞ 5 ∞ ∞
•生成森林: 由非连通图的每个连通分量可以分 别得到一棵生成树,各个连通分量的生成树组合 构成一个生成森林(SPANNING FOREST).
9. 2 图的存储结构
图的存储结构比较复杂,其复杂性主要表现在:
◆ 任意顶点之间可能存在联系,无法以数据元素在存储区中的物理 位置来表示元素之间的关系。 ◆ 图中顶点的度不一样,有的可能相差很大,若按度数最大的顶点 设计结构,则会浪费很多存储单元,反之按每个顶点自己的度设计不 同的结构,又会影响操作。

2
2
3 1 3
1
例 2 1 4 3
有向完全图 5 6
无向完全图
5
3 例 2 4 3 G1 顶点2入度:1 顶点4入度:1 出度:3 出度:0 5 6
6
图与子图 例 1 5 7
1
3
2
G2
4
6
顶点5的度:3 顶点2的度:4
例 2 1 4 3
G1
5 6
路径:1,2,3,5,6,3 路径长度:5 简单路径:1,2,3,5 回路:1,2,3,5,6,3,1 简单回路:3,5,6,3
V0
V1
2 0
3 0∧
2 3 ∧∧ 3 1∧ 3 2 ∧∧
3 V3
图9-13 有向图的十字链表结构
9.3 图的实现
UnweightedGraph Graph AbstractGraph WeightedGraph
Interface
Abstract Class
Concrete Classes
42
« interface»
无向图 在无向图中,结点对(x, y)是 无序的,结点对(x, y)称为与结点x和结点y 相关联的一条边。(x, y)等价于<x, y>和< y, x>。
0 1 2 3 3 1 4
0 2 5 6

完全图 在有n个结点的无向图中,若有n(n1)/2条边,即任意两个结点之间有且只有一条边,则称 此图为无向完全图。在有n个结点的有向图中,若有 n(n-1)条边,即任意两个结点之间有且只有方向相反 的两条边,则称此图为有向完全图。
0 2 5 (b) 6
0 1 2 (c)
0
1
2 (d)
3


结点的度 结点v的度是与它相关联的边的条 数,记作TD(v)。 顶点 v 的入度 是以 v 为终点的有向边的条数, 记作 ID(v); 顶点 v 的出度是以 v 为始点的有向 边的条数, 记作 OD(v)。
0 1 2 (a) 3 3 1 4

无向图的邻接表

有向图的邻接表和逆邻接表
2 邻接表法的特点
◆ 表头向量中每个分量就是一个单链表的头结点,分量个数就是图 中的顶点数目;
◆ 在边或弧稀疏的条件下,用邻接表表示比用邻接矩阵表示节省存 储空间; ◆ 在无向图,顶点Vi的度是第i个链表的结点数; ◆ 对有向图可以建立正邻接表或逆邻接表。正邻接表是以顶点Vi为 出度(即为弧的起点)而建立的邻接表;逆邻接表是以顶点Vi为入度 (即为弧的终点)而建立的邻接表; ◆ 在有向图中,第i个链表中的结点数是顶点Vi的出 (或入)度;求 入 (或出)度,须遍历整个邻接表; ◆ 在邻接表上容易找出任一顶点的第一个邻接点和下一个邻接点;
A B vexs C D E
邻接矩阵的实现(自行实现):
图的类型包括:无向图、无向网、有向图、有向网
9.2.2 邻接链表法
基本思想:对图的每个顶点建立一个单链表,存储 该顶点所有邻接顶点及其相关信息。每一个单链表设一 个表头结点。 第i个单链表表示依附于顶点Vi的边(对有向图是以 顶点Vi为头或尾的弧)。
例 1 3 2 5 4 7 6 路径:1,2,5,7,6,5,2,3 路径长度:7 简单路径:1,2,5,7,6 回路:1,2,5,7,6,5,2,1 简单回路:1,2,3,1
G2
例 2 1 4 3 5
连通图
6
例 3
5
强连通图
6
例 2 1 4 3 5 6
非连通图 连通分量
生成树 一个连通图的生成树是它的极小 连通子图,在n个顶点的情形下,有n-1条 边。
图的常用的存储结构有:邻接矩阵、邻接链表、 十字链表、邻接多重表和边表。
9.2.1 邻接矩阵(数组)表示法
基本思想:对于有n个顶点的图,用一维数组vexs[n]
存储顶点信息,用二维数组A[n][n]存储顶点之间关系 的信息。该二维数组称为邻接矩阵。在邻接矩阵中,以 顶点在vexs数组中的下标代表顶点,邻接矩阵中的元 素A[i][j]存放的是顶点i到顶点j之间关系的信息。

有向图 在有向图中,结点对<x, y> 是有序的,结点对<x, y>称为从结点x到结点 y的一条有向边,因此,<x, y>与<y, x>是 两条不同的边。有向图中的结点对<x, y>用 一对尖括号括起来,x是有向边的始点,y是有 向边的终点,有向图中的边也称作弧(Arc).
0 1 2
0
1
2
3

9.2.3 十字链表法
十字链表(Orthogonal List)是有向图的另一种链式存
储结构,是将有向图的正邻接表和逆邻接表结合起来得 到的一种链表。
在这种结构中,每条弧的弧头结点和弧尾结点都 存放在链表中,并将弧结点分别组织到以弧尾结点为头 (顶点)结点和以弧头结点为头(顶点)结点的链表中。这 种结构的结点逻辑结构如图9-12所示。
Graph<V>
+getSize(): int +getVertices(): List<V> +getVertex(index: int): V +getIndex(v: V): int +getNeighbors(index: int): List<Integer> +getDegree(index: int): int +getAdjacencyMatrix(): int[][] +printAdjacencyMatrix(): void +printEdges(): void +dfs(index: int): AbstractGraph<V>.Tree +bfs(index: int): AbstractGraph<V>.Tree
◆ 无向图的边数是上(或下)三角形矩阵中非0元素 个数。
2 有向图的数组表示
(1) 无权图的邻接矩阵
若有向无权图G=(V,E)有n(n≧1)个顶点,则其邻 接矩阵是n阶对称方阵,如图9-7所示。元素定义如下:
A[i][j]= 1 若<vi, vj>E,从vi到vj有弧 0 若<vi , vj>E 从vi到vj 没有弧


权 有些图的边附带有数据信息,这些附带 的数据信息称为权。第i条边的权用符号wi表示。 路径长度 对于不带权的图,一条路径的路 径长度是指该路径上的边的条数;对于带权的图, 一条路径的路径长度是指该路径上各个边权值的总 和。
2 10 1 15 4 16 6 3 7 12 7 6 3 7 5 9 8 6 A 30 D 75 45 E B 60 80 40 C 35
1 无向图的数组表示
(1) 无权图的邻接矩阵
无向无权图G=(V,E)有n(n≧1)个顶点,其邻接 矩阵是n阶对称方阵,如图9-5所示。其元素的定义如 下: 1 若(vi , vj)E,即vi , vj邻接 A[i][j]= 0 若(vi , vj)E,即vi , vj不邻接
a b d c vexs a b c d
◆ 头域headvex:指示弧头顶点在图中的位置; ◆ 指针域hlink:指向弧头相同的下一条弧;
◆ 指针域tlink:指向弧尾相同的下一条弧;
◆ Info域:指向该弧的相关信息;
图9-13所示是一个有向图及其十字链表(略去了表结点 的info域)。 从这种存储结构图可以看出,从一个顶点结点的 firstout出发,沿表结点的tlink指针构成了正邻接表 的链表结构,而从一个顶点结点的firstin出发,沿表 结点的hlink指针构成了逆邻接表的链表结构。 0 V0 1 V1 V2 V3 2 V2 ∧ 0 1 0 2 ∧
a
b
e
c d
(a) 有向图
vexs a b c d e
(b) 顶点矩阵
0 1 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0 1 0
(c) 邻接矩阵
图9-7 有向无权图的数组存储
(2) 带权图的邻接矩阵
有向带权图G=(V,E)的邻接矩阵如图9-8所示。其 元素的定义如下:
1. 图的基本概念 2. 图的存储结构 3. 图的遍历 4. 最小生成树 5. 最短路径 6. 拓扑排序 7. 关键路径
9.1 图的基本概念 定义: 图是由顶点集合(vertex)及边的集合 组成的一种数据结构: Graph=( V, E ) 其中 V = { x | x 某个数据对象} 是顶点的 有穷非空集合; E = {(x, y) | x, y V } 是顶点之间关系的有穷集合,也叫做边 (edge)集 合。例如:E={ <A,B>,<C,D>,<A.D>,<B,C>}
0 1 2 3
0
1
2
3
邻接结点 在无向图G中,若(u, v)是E(G) 中的一条边,则称u和v互为邻接结点,并称边(u, v) 依附于结点u和v。在有向图G中,若<u, v>是E(G) 中的一条边,则称结点u邻接到结点v,结点v邻接自 结点u,并称边<u, v>和结点u和结点v相关联。

0 1 2 (a) 3 3 1 4
相关文档
最新文档