算法复习——图算法篇之图的基本概念
以下内容主要参考中国大学MOOC《算法设计与分析》,墙裂推荐希望入门算法的童鞋学习!
1. 图的概念
1.1 图的定义
- 图可以表示为一个二元组
G
=
<
V
,
E
>
G = <V, E>
G=<V,E>,其中
- V V V表示非空顶点集,其元素称为顶点(Vertex)
- E E E表示边集,其元素称为边(Edge)
- e = ( u , v ) e = (u, v) e=(u,v)表示一条边,其中 u ∈ V u \in V u∈V, v ∈ V v \in V v∈V, e ∈ E e \in E e∈E
1.2 相邻与关联
- 相邻(Adjacent)
- 边 ( u , v ) (u, v) (u,v)连接的顶点 u u u和 v v v相邻
- 关联(Incident)
- 边 ( u , v ) (u, v) (u,v)和其连接的顶点 u u u(或 v v v)相互关联
1.3 度
- 顶点的度(Degree of a Vertex)
- 顶点 v v v的度 d e g ( v ) deg(v) deg(v)是 v v v关联的边数
- 图的度(Degree of a Graph)
- 图 G = < V , E > G = <V, E> G=<V,E>的度,是图各顶点的度之和, d e g ( G ) = ∑ v ∈ V d e g ( v ) deg(G) = \sum_{v \in V}deg(v) deg(G)=∑v∈Vdeg(v)
- 握手定理(Handshaking Lemma)
- 无向图的度是边数的两倍, d e g ( G ) = 2 ∣ E ∣ deg(G)=2|E| deg(G)=2∣E∣
- 证明:因为边 e = ( u , v ) e=(u,v) e=(u,v)在 d e g ( u ) deg(u) deg(u)和 d e g ( v ) deg(v) deg(v)中各被计算一次,所以每条边为图的度贡献为2, d e g ( G ) = ∑ e ∈ E 2 = 2 ∣ E ∣ deg(G)=\sum_{e \in E}2=2|E| deg(G)=∑e∈E2=2∣E∣
1.4 路径
- 路径(Path)
- 图中的一个顶点序列 < v 0 , v 1 , . . . , v k > <v_0, v_1, ..., v_k> <v0,v1,...,vk>称为 v 0 v_0 v0到 v k v_k vk的路径
- 路径包含顶点 v 0 , v 1 , . . . , v k v_0, v_1, ..., v_k v0,v1,...,vk和边 ( v 0 , v 1 ) , ( v 1 , v 2 ) , . . . , ( v k − 1 , v k ) (v_0, v_1), (v_1, v_2), ..., (v_{k-1}, v_k) (v0,v1),(v1,v2),...,(vk−1,vk)
- 存在路径 < v 0 , v 1 , . . . , v k > <v_0, v_1, ..., v_k> <v0,v1,...,vk>,则 v 0 v_0 v0可达 v k v_k vk
- 如果 v 0 , v 1 , . . . , v k v_0, v_1, ..., v_k v0,v1,...,vk互不相同,则该路径是简单的
1.5 环路
- 环路(Cycle)
- 如果路径 < v 0 , v 1 , . . . , v k > <v_0, v_1, ..., v_k> <v0,v1,...,vk>中 v 0 = v k v_0 = v_k v0=vk且至少包含一条边,则该路径构成环路
- 如果 v 1 , v 2 , . . . , v k v_1, v_2, ..., v_k v1,v2,...,vk互不相同,则该环路是简单的
- 无环图(Acyclic Graph):图中不存在环路
1.6 连通
- 连通(Connectivity)
- 如果图的任意对顶点互相可达,则称该图是连通的,反之称为非连通
- 连通分量(Connected Components)
- 根据是否连通将顶点进行分组,相互可达的顶点集称为连通分量
1.7 子图
- 子图(Subgraph)
- 如果 V ′ ⊆ V , E ′ ⊆ E V' \subseteq V, E' \subseteq E V′⊆V,E′⊆E,则称图 G ′ = < V ′ , E ′ > G'=<V', E'> G′=<V′,E′>是图 G G G的一个子图
- 生成子图(Spanning Subgraph)
- 如果 V ′ = V , E ′ ⊆ E V' = V, E' \subseteq E V′=V,E′⊆E,则称图 G ′ = < V ′ , E ′ > G'=<V', E'> G′=<V′,E′>是图 G G G的一个生成子图
1.8 树
- 树(Tree)
- 连通、无环图 T = < V T , E T > T=<V_T, E_T> T=<VT,ET>,树有 ∣ V T ∣ − 1 |V_T|-1 ∣VT∣−1条边
- 森林(Forest)
- 一至多颗树组成的无环图
2. 图的表示
2.1 邻接链表
- 图 G = < V , E > G=<V, E> G=<V,E>,其邻接链表由 ∣ V ∣ |V| ∣V∣条链表的数组构成
- 每个顶点有一条链表,包含所有与其相邻的顶点
- 空间大小 O ( ∣ v ∣ + ∣ E ∣ ) O(|v|+|E|) O(∣v∣+∣E∣)
2.2 邻接矩阵
-
图 G = < V , E > G=<V, E> G=<V,E>的邻接矩阵由 ∣ V ∣ ∗ ∣ V ∣ |V|*|V| ∣V∣∗∣V∣的二维数组 A A A构成,满足:
A i j = { 1 , ( i , j ) ∈ E 0 , ( i , j ) ∉ E A_{ij}=\left\{ \begin{array}{rcl} 1, & & {(i, j) \in E}\\ 0, & & {(i, j) \notin E} \end{array} \right. Aij={1,0,(i,j)∈E(i,j)∈/E -
空间大小 O ( ∣ V ∣ 2 ) O(|V|^2) O(∣V∣2), O ( 1 ) O(1) O(1)判断是否有边