数据结构与算法分析——目录
第一部分:数据结构
数据结构——图结构:图
图基础
\quad 图是一种比线性表和数更为复杂的数据结构。在图结构中,结点之间的关系可以是任意的,也就是说,图中的任意两个数据元素之间都可能相关。
\quad 图的应用十分广泛,已渗透到诸如物理、化学、计算机科学,以及数学等其它分支中。
图的定义
\quad 图(Graph) G G G 由两个集合 V V V 和 E E E 组成。通常将图记作二元组 G = ( V , E ) G=(V,E) G=(V,E)。其中
- 集合 V V V 中的元素称为 顶点(Vertex);
- 集合 E E E 中的元素对应一对顶点 ( u , v ) (u,v) (u,v),表示它们之间存在某种关系,称为 边(Edge) ;
- E ⊆ V × V E \subseteq V \times V E⊆V×V.
\quad 在图 G G G 中,顶点集合 V ( G ) V(G) V(G) 为非空有穷集合(没有顶点的空图没有实际意义),边集合 E ( G ) E(G) E(G)可以为空,表示图 G G G 只有顶点没有边。
\quad 按照图中边是否有向,可将图分为 有向图 和 无向图。
- 在有向图中 G = ( V , E ) G=(V,E) G=(V,E) 中,边 ( u , v ) (u,v) (u,v) 是有序的,称作从顶点 u u u 到 顶点 v v v 的 有向边。因此,边 ( u , v ) (u,v) (u,v) 与 边 ( v , u ) (v,u) (v,u) 是不同的两条有向边。
- 在无向图 G = ( V , E ) G=(V,E) G=(V,E) 中,边 ( u , v ) (u,v) (u,v) 是无序的,称作顶点 u u u 和 顶点 v v v 之间的 无向边。因此,边 ( u , v ) (u,v) (u,v) 与 边 ( v , u ) (v,u) (v,u) 是同一条有向边。
注:
\quad 有向图中的边 ( u , v ) (u,v) (u,v) 也可以记作 < u , v > <u,v> <u,v>。有向边也称为 弧(arc),在弧 < u , v > <u,v> <u,v> 中, u u u 为 弧头, v v v 为 弧尾。
图 1 : 有 向 图 G 1 与 无 向 图 G 2 图1:有向图~G_1~与无向图~G_2 图1:有向图 G1 与无向图 G2
图的基本术语
完全图与有向完全图
\quad 用 n n n 表示图 G G G 的顶点数目,用 e e e 表示边的数目,则:
- 无向图的边数 e e e 的取值范围为 0 ∼ n ( n − 1 ) 2 0 \sim\frac{n(n-1)}{2} 0∼2n(n−1),边数为 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n−1) 的无向图称为 完全图;
- 有向图的边数 e e e 的取值范围为 0 ∼ n ( n − 1 ) 0 \sim n(n-1) 0∼n(n−1),边数为 n ( n − 1 ) n(n-1) n(n−1) 的有向图称为 有向完全图。
稀疏图与稠密图
\quad 边数较少的图称为 稀疏图(Sparse graph),反之为 稠密图(Dense graph)。
子图
\quad G 1 = ( V 1 , E 1 ) G_1 = (V_1,E_1) G1=(V1,E1), G 2 = ( V 2 , E 2 ) G_2=(V_2,E_2) G2=(V2,E2) 是两个图,若 V 1 ⊆ V 2 V_1 \subseteq V_2 V1⊆V2 且 E 1 ⊆ E 2 E_1 \subseteq E_2 E1⊆E2,则称 G 1 G_1 G1 是 G 2 G_2 G2 的 子图。
图
2
:
有
向
图
G
1
的
子
图
图2:有向图~G_1~的子图
图2:有向图 G1 的子图
图
3
:
无
向
图
G
2
的
子
图
图3:无向图~G_2~的子图
图3:无向图 G2 的子图
权和网
\quad 图的边或弧上具有与之相关的数称为 权(Weight)。带权的图称为 网(Network)。
- 无向图 → \rightarrow → 无向网;
- 有向图 → \rightarrow → 有向网。
邻接
\quad 在无向图 G = ( V , E ) G=(V,E) G=(V,E) 中,若边 ( u , v ) ∈ E (u,v) \in E (u,v)∈E,则称顶点 u u u 和 v v v 互为 邻接点(Adjacent node),顶点 u u u 和 v v v 相邻接。称边 ( u , v ) (u,v) (u,v) 依附于 顶点 u u u 和 v v v,或者称边 ( u , v ) (u,v) (u,v) 与顶点 u , v u,v u,v 相关联。
\quad
在有向图
G
=
(
V
,
E
)
G=(V,E)
G=(V,E) 中,若
(
u
,
v
)
∈
E
(u,v) \in E
(u,v)∈E,则称顶点
u
u
u 邻接到
顶点
v
v
v,或者顶点
v
v
v 邻接自
顶点
u
u
u。
度
与顶点 v v v 相关联的边的数目称为该顶点的 度(Degree),记作 T D ( v ) TD(v) TD(v)。
入度
\quad 在有向图 G = ( V , E ) G=(V,E) G=(V,E) 中,以顶点 v ∈ V v \in V v∈V 为弧头的弧的数目称为该顶点的 入度(InDegree),记作 I D ( v ) ID(v) ID(v)。
出度
\quad 在有向图 G = ( V , E ) G=(V,E) G=(V,E) 中,以顶点 v ∈ V v \in V v∈V 为弧尾的弧的数目称为该顶点的 出度(OutDegree),记作 O D ( v ) OD(v) OD(v)。
在具有
n
n
n 个顶点,
e
e
e 条边的图
G
=
(
V
,
E
)
G=(V,E)
G=(V,E) 中,记顶点
v
i
∈
V
v_i \in V
vi∈V 的度为
T
D
(
v
i
)
TD(v_i)
TD(vi),则有
e
=
1
2
∑
i
=
1
n
T
D
(
v
i
)
。
(1)
e =\frac{1}{2} \sum_{i=1}^{n}{TD(v_i)}。 \tag{1}
e=21i=1∑nTD(vi)。(1)
路径
\quad 若图 G = ( V , E ) G=(V,E) G=(V,E) 是无向图,则顶点 u ∈ V u \in V u∈V 到顶点 v ∈ V v \in V v∈V 的 路径 是一个顶点序列 ( u = w i 1 , w i 2 , ⋯ , w i k = v ) (u=w_{i_1},w_{i_2},\cdots,w_{i_{k}}=v) (u=wi1,wi2,⋯,wik=v),其中 ( w i j − 1 , w i j ) ∈ E , 1 ≤ j ≤ k (w_{i_{j-1}},w_{i_{j}}) \in E,1 \le j \le k (wij−1,wij)∈E,1≤j≤k。
\quad 若图 G = ( V , E ) G=(V,E) G=(V,E) 是有向图,则顶点 u ∈ V u \in V u∈V 到顶点 v ∈ V v \in V v∈V 的 路径 为 有向路径,同样可以表示为顶点序列 ( u = w i 1 , w i 2 , ⋯ , w i k = v ) (u=w_{i_1},w_{i_2},\cdots,w_{i_{k}}=v) (u=wi1,wi2,⋯,wik=v),其中 < w i j − 1 , w i j > ∈ E , 1 ≤ j ≤ k <w_{i_{j-1}},w_{i_{j}}> \in E,1 \le j \le k <wij−1,wij>∈E,1≤j≤k。
\quad 路径的长度 是路径上的边或弧的数目。
\quad 第一个顶点和最后一个顶点相同的路径称为 回路 或 环(Cycle)。
\quad 一条路径的顶点序列中,若不存在重复的顶点,则称该路径为 简单路径。
\quad 除第一个顶点和最后一个顶点之外,其余顶点都不重复出现的回路称为 简单路径 或 简单环。
连通图
\quad 在无向图 G = ( V , E ) G=(V,E) G=(V,E) 中,若从顶点 u ∈ V u \in V u∈V 到顶点 v ∈ V v \in V v∈V 存在路径,则称顶点 u u u 和 v v v 是 连通 的。
\quad 在无向图 G = ( V , E ) G=(V,E) G=(V,E) 中,若任意两个顶点 v i , v j ∈ V v_i,v_j \in V vi,vj∈V 都是连通的,则称 G = ( V , E ) G=(V,E) G=(V,E) 是 连通图(Connected graph)。
图
4
:
连
通
图
G
3
图4:连通图~G_3
图4:连通图 G3
\quad
无向图中的 极大连通子图 称为 连通分量(Connected component)。
图 5 : 无 向 图 G 4 的 连 通 分 量 图5:无向图~G_4~的连通分量 图5:无向图 G4 的连通分量
\quad 在有向图 G = ( V , E ) G=(V,E) G=(V,E) 中,若对于任意两个顶点 v i , v j ∈ V , v i ≠ v j v_i,v_j \in V,v_i \ne v_j vi,vj∈V,vi=vj,从顶点 v i v_i vi 到顶点 v j v_j vj 和从顶点 v i v_i vi 到顶点 v j v_j vj 都存在路径,则称 G = ( V , E ) G=(V,E) G=(V,E) 为 强连通图。
\quad 有向图中的 极大强连通子图 称为 强连通分量。
图 6 : 有 向 图 G 1 的 强 连 通 分 量 图6:有向图~G_1~的强连通分量 图6:有向图 G1 的强连通分量
连通图的生成树
\quad 连通图的 极小连通子图 称为该连通图的 生成树。它含有图中全部的顶点,但只有足以构成一棵树的 n − 1 n-1 n−1 条边。
注意:
- 若在一棵生成树上添加一条边,则必定构成一个环,因为这条边使得它依附的两个顶点之间产生了第二条路径。
- 一棵有 n n n 个顶点的生成树有且仅有 n − 1 n-1 n−1 条边。若一个图有 n n n 个顶点但边数少于 n − 1 n-1 n−1,则该图不是连通图,因此没有生成树。
- 有 n − 1 n-1 n−1 条边的图也不一定是生成树,因为图中可能有环。
有向树与生成森林
\quad
若一个有向图中恰好有一个顶点的入度为
0
0
0,其余顶点的入度均为
1
1
1,则是一棵
有向树。
\quad 一个有向图的 生成森林 由若干棵有向树组成,含有图中全部的顶点,但只足以构成若干棵不相交的有向树的弧。
参考文献
[1] 严蔚敏, 李冬梅和吴伟民. 数据结构(C语言版). 第2版. 北京: 人民邮电出版社, 2011.