前言
本文章是根据法国国立高等电力技术、电子学、计算机、水力学与电信学校 (E.N.S.E.E.I.H.T.) 第七学期课程*“Graph Theory”* 总结而来的课程笔记。碍于本人学识有限,部分叙述难免存在纰漏,请读者注意甄别。
第一部分:基本概念及定义
无向图
图
一个有限图 G = ( V , E ) G = (V,E) G = ( V , E ) 由非空 (non vide) 有限 (fini) 顶点集 (sommets / vertex) V V V
V = { v 0 , v 1 , . . . , v n − 1 } V = \{ v_0, v_1,...,v_{n-1}\}
V = { v 0 , v 1 , . . . , v n − 1 }
和有限边集 (Arête / Edge) E E E 组成。
E = { e 0 , e 1 , . . . , e n − 1 } E = \{ e_0, e_1,...,e_{n-1}\}
E = { e 0 , e 1 , . . . , e n − 1 }
其中,每个边 由一对顶点 { v i , v j } \{ v_i, v_j\} { v i , v j } 构成。顶点数 又被称为图的阶数 (ordre)。
相关概念:
如果 n = n b ( V ) n = nb(V) n = n b ( V ) ,那么我们称该图 G = ( V , E ) G = (V,E) G = ( V , E ) 是一个 n 阶 图 n阶图 n 阶 图 (ordre) ;
如果 e = { v i , v j } e = \{v_i, v_j\} e = { v i , v j } ,我们说边 e e e 与顶点 v i v_i v i 和 v j v_j v j 相关 (incidente) ;
如果 e = { v i , v j } e = \{v_i,v_j\} e = { v i , v j } ,我们说 v i v_i v i 和 v j v_j v j 是邻接的 (adjacents) ;
两条边 是相邻 的当且仅当它们有一个共同的顶点 ;
e = { v i , v i } e = \{v_i, v_i\} e = { v i , v i } 是一个环 (boucle) ;
两个节点之间可能有多条边的图称为多重图 (multigraphe) 。
一个图是简单的 (simple) ,当且仅当
没有环 (boucle) ,
两个顶点之间最多有一条边 (无重边);
一个顶点在图中的度 (degree ) δ ( v i ) δ(v_i) δ ( v i ) 为 与这个顶点 v i v_i v i 相连接的边的数目 ;
如果每个顶点彼此相邻,即每两个顶点间都有边相连,则称该图是**完全(complet)**图;
Q1 : n阶简单完全图的边数是多少?
# E ( n 阶 简 单 完 全 图 ) = n ( n − 1 ) 2 \# E(n阶简单完全图) = \tfrac{n(n-1)}{2}
# E ( n 阶 简 单 完 全 图 ) = 2 n ( n − 1 )
无向图中,所有顶点度数之和 ∑ d e g ( v ) = 2 ∣ E ∣ ∑deg(v)=2|E| ∑ d e g ( v ) = 2 ∣ E ∣ ,即奇数度的顶点数必是偶数 。
思考:一种“从无到有”的推广假设
连接两个偶度顶点,这个时候奇度顶点的数量增加2;
连接两个奇度顶点,这个时候奇度顶点的数量减少2;
连接一个奇度顶点和一个偶度顶点,奇度顶点的数量不变。
**k k k -正则图 (k-regulier)**是指所有顶点的度都为 k k k 的图;
有向图
如果一个图 G = ( V , E ) G = (V,E) G = ( V , E ) 的点对(或边)是有序的,那么图 G G G 就是有向的(orienté) 。
相关概念:
在一个有向弧 e = ( i , j ) e =(i,j) e = ( i , j ) 中,i i i 被称为 e e e 的起点(l’origine), j j j 是 e e e 的终点( l’arrivée);
对于顶点v v v ,出度 δ + ( v ) δ^+(v) δ + ( v ) 是以 v v v 为起点的弧的数量;
入度 δ − ( v ) δ^−(v) δ − ( v ) 是以 v v v 为终点的弧的数量;
总度数 δ ( v ) = δ + ( v ) + δ − ( v ) δ(v) = δ^+(v) + δ^−(v) δ ( v ) = δ + ( v ) + δ − ( v ) , ∑ v ∈ V δ ( v ) = 2 × n b ( E ) ∑_{v \in V} δ(v) = 2 \times nb(E) ∑ v ∈ V δ ( v ) = 2 × n b ( E ) 。
子图(sous-graphe)
由图 G = ( V , E ) G = (V,E) G = ( V , E ) 的顶点 V V V 的子集 V ′ ⊂ V V ' ⊂ V V ′ ⊂ V 生成的 G ′ = ( V ′ , E ′ ) G' = (V' , E' ) G ′ = ( V ′ , E ′ ) 是 G G G 的子图。其中 E ′ E' E ′ 表示 E E E 的两个端点都在 V ′ V' V ′ 中的所有边。
G = ( V , E ) ⟶ V ′ ⊂ V G ′ = ( V ′ , E ′ ) G=(V,E) \quad \stackrel{V'⊂V} \longrightarrow \quad G'=(V',E')
G = ( V , E ) ⟶ V ′ ⊂ V G ′ = ( V ′ , E ′ )
子图:点和边都能在原图中找到
母图:原图
真子图:不等于母图的子图
生成子图:包含所有顶点的子图
基础简单图:从一个图中去掉所有重边及环后所得的剩余图称为基础简单图
点导出子图:顶点是原图顶点的子集且加入两端都在子集中的边构成的图
边导出子图:由原图边集的子集及其所有端点构成的图
完全子图
I F ( 子 图 i s 完 全 图 ) T H E N ( 完 全 子 图 ) IF(子图 \; is\; 完全图)\quad THEN(完全子图)
I F ( 子 图 i s 完 全 图 ) T H E N ( 完 全 子 图 )
团(clique)
G G G 的完全子图是 G G G 的团,当且仅当 G ′ G' G ′ 不包含在 G G G 的更大的完全子图中,也就是说 G ′ G' G ′ 是 G G G 的极大完全子图。
由上图所示,1 和 2 就是原图的两个团。其中 1 是最大团。
最大团
G G G 的最大团是指 G G G 的所有团中,含顶点数最大的团,比如说 1 就是最大团。
部分图(graphe partiel)
由 E ′ ⊂ E E' ⊂ E E ′ ⊂ E 生成的 G = ( V , E ) G = (V,E) G = ( V , E ) 的部分图是图 G ′ = ( V , E ′ ) G'= (V,E') G ′ = ( V , E ′ ) 。
G = ( V , E ) ⟶ E ′ ⊂ E G ′ = ( V , E ′ ) G=(V,E) \quad \stackrel{E'⊂E} \longrightarrow \quad G'=(V,E')
G = ( V , E ) ⟶ E ′ ⊂ E G ′ = ( V , E ′ )
关联矩阵(matrice d’incidence)
设任意图 G = ( V , E ) G=(V,E) G = ( V , E ) ,其中顶点集 V = v 1 , v 2 , . . . , v n V=v_1,v_2,...,v_n V = v 1 , v 2 , . . . , v n ,边集 E = e 1 , e 2 , . . . , e ε E=e_1,e_2,...,e_ε E = e 1 , e 2 , . . . , e ε 。用 m i j m_{ij} m i j 表示顶点 v i v_i v i 与边 e j e_j e j 关联的次数,可能取值为 0 , 1 , 2 , … 0,1,2,… 0 , 1 , 2 , … ,称所得矩阵 M ( G ) = ( m i j ) n × ε \mathcal{M}(G)=(m_{ij})_{n×ε} M ( G ) = ( m i j ) n × ε 为图G的关联矩阵
类似地,有向图 D D D 的关联矩阵 M ( D ) = ( m i j ) n × ε \mathcal{M}(D)=(m_{ij})_{n×ε} M ( D ) = ( m i j ) n × ε 的元素 m i × j m_{i×j} m i × j 定义为:
m i j = { 1 v i 是 有 向 边 a j 的 始 点 − 1 v i 是 有 向 边 a j 的 终 点 0 v i 是 有 向 边 a j 的 不 关 联 点 m_{ij}=\begin{cases}
1 \qquad v_i是有向边a_j的始点\\
-1 \qquad v_i是有向边a_j的终点\\
0 \qquad v_i是有向边a_j的不关联点
\end{cases}
m i j = ⎩ ⎪ ⎨ ⎪ ⎧ 1 v i 是 有 向 边 a j 的 始 点 − 1 v i 是 有 向 边 a j 的 终 点 0 v i 是 有 向 边 a j 的 不 关 联 点
邻接矩阵(matrice d’adjacence)
设无向图 G = ( V , E ) G=(V,E) G = ( V , E ) ,其中顶点集V = v 1 , v 2 , . . . , v n V=v_1,v_2,...,v_n V = v 1 , v 2 , . . . , v n ,边集 E = e 1 , e 2 , . . . , e ε E=e_1,e_2,...,e_ε E = e 1 , e 2 , . . . , e ε 。用 a i j a_{ij} a i j 表示顶点 v i v_i v i 与顶点 v j v_j v j 之间的边数,可能取值为 0 , 1 , 2 , … 0,1,2,… 0 , 1 , 2 , … ,称所得矩阵 A = A ( G ) = ( a i j ) n × n A=A(G)=(a_{ij})_{n×n} A = A ( G ) = ( a i j ) n × n 为图G G G 的邻接矩阵
若干性质:
A ( G ) \mathcal{A}(G) A ( G ) 为对称矩阵
若 G G G 为无环图,则 A ( G ) \mathcal{A}(G) A ( G ) 中第 i i i 行(列)的元素之和等于顶点 v i v_i v i 的度
两图 G G G 和 H H H 同构 的充要条件是存在置换矩阵 P \mathcal{P} P 使得 A ( G ) = P T A ( H ) P \mathcal{A}(G) = \mathcal{P}^T\mathcal{A}(H) \mathcal{P} A ( G ) = P T A ( H ) P
类似地,有向图 D D D 的邻接矩阵= A ( D ) ( a i j ) n × n =\mathcal{A}(D)(a_{ij})_{n×n} = A ( D ) ( a i j ) n × n , a i j a_{ij} a i j 表示从始点 v i v_i v i 到终点 v j v_j v j 的有向边的条数 ,其中 v i v_i v i 和 v j v_j v j 为 D D D 的顶点。
示例,求图中有向图的邻接矩阵和关联矩阵(图中边上的数字为边的编号 ,而非权重):
邻接矩阵为:
[ 0 1 0 1 0 0 0 1 1 1 0 0 0 0 1 0 ] \begin{bmatrix}
0 & 1 & 0 & 1\\
0 & 0 & 0 & 1\\
1 & 1 & 0 & 0\\
0 & 0 & 1 & 0
\end{bmatrix}
⎣ ⎢ ⎢ ⎡ 0 0 1 0 1 0 1 0 0 0 0 1 1 1 0 0 ⎦ ⎥ ⎥ ⎤
关联矩阵为:
[ 1 0 0 − 1 1 0 − 1 1 0 0 0 − 1 0 0 − 1 1 0 1 0 − 1 1 0 − 1 0 ] \begin{bmatrix}
1 & 0 & 0 & -1 & 1 & 0\\
-1 & 1 & 0 & 0 & 0 & -1\\
0 & 0 & -1 & 1 & 0 & 1\\
0 & -1 & 1 & 0 & -1 & 0
\end{bmatrix}
⎣ ⎢ ⎢ ⎡ 1 − 1 0 0 0 1 0 − 1 0 0 − 1 1 − 1 0 1 0 1 0 0 − 1 0 − 1 1 0 ⎦ ⎥ ⎥ ⎤
加权图(graphe pondéré)
如果每条弧与正 的实际权重 (poids) 相关联,则对图进行加权。
第二部分:连通
链(Chaîne)
长度为 q ∈ N q ∈ N q ∈ N 的链 ( e 1 , . . . , e q ) (e_1, ..., e_q) ( e 1 , . . . , e q ) 是 q q q 个连续相邻边的序列 。 因此存在一个顶点序列 ( v 1 , . . . , v q + 1 ) (v_1,...,v_{q+1}) ( v 1 , . . . , v q + 1 ) ,使得 v i v_i v i 是 e i − 1 e_{i-1} e i − 1 和 e i e_i e i 的端点。
相关概念:
该链被称为连接 顶点 v 1 v_1 v 1 和 v q + 1 v_{q+1} v q + 1 的链;
简单链 (simple) :在边的序列中各边互不相同
基本链 (élémentaire) :在顶点的序列中各顶点互不相同
基本简单链可以称其为 路 (chemin):序列中的边 和顶点 都不相同
如果 v 1 = v q + 1 v_1 = v_{q+1} v 1 = v q + 1 ,则链是**闭合 (fermée)**的;
q q q 是链的长度。
环(Cycle)
环是一个**闭合 (fermée)**的单链;
两个顶点间的距离 (Distance) 是两个顶点间最短链的长度 ;
图的直径 (Diamètre) 是图的两个顶点之间的最大距离 。 如果有未连接的顶点,则为 + ∞ +∞ + ∞ (连接性的定义在后面)。
无环图 G G G 最多 有 n − 1 n-1 n − 1 条边
proof:
# E 一 般 无 环 图 ≤ # E 无 环 连 通 图 = n − 1 \# E_{一般无环图} \le \# E_{无环连通图} = n-1
# E 一 般 无 环 图 ≤ # E 无 环 连 通 图 = n − 1
如果遍历的顶点除了第一个和最后一个之外是互不相同的,则环是基本的 (élémentaire) 。
例1:在下图的无向图中,
链 ( 1 , 2 , 5 , 1 , 3 , 5 , 1 ) (1,2,5,1,3,5,1) ( 1 , 2 , 5 , 1 , 3 , 5 , 1 ) 是一条非基本 (non-élémentaire) 闭合 (fermée) 链
链 ( 1 , 2 , 5 , 1 , 3 , ) (1,2,5,1,3,) ( 1 , 2 , 5 , 1 , 3 , ) 是一条非基本 (non-élémentaire) 非闭合 (non-fermée) 链
基本环(基本闭合链):( 1 , 2 , 5 , 1 ) (1,2,5,1) ( 1 , 2 , 5 , 1 )
非基本环(非基本闭合链):( 1 , 2 , 5 , 1 , 3 , 5 , 4 , 1 ) (1,2,5,1,3,5,4,1) ( 1 , 2 , 5 , 1 , 3 , 5 , 4 , 1 )
例2 :在下图的有向图中,
基本路径 (chemin: non-fermée) :( 1 , 4 , 2 , 3 ) (1,4,2,3) ( 1 , 4 , 2 , 3 )
非基本路径:( 1 , 3 , 1 , 4 ) (1,3,1,4) ( 1 , 3 , 1 , 4 )
基本环 (circuit) :( 1 , 4 , 2 , 3 , 1 ) (1,4,2,3,1) ( 1 , 4 , 2 , 3 , 1 )
非基本环 (circuit) :( 1 , 3 , 1 , 4 , 2 , 1 ) (1,3,1,4,2,1) ( 1 , 3 , 1 , 4 , 2 , 1 )
割点及割边
割点
【定义】设连通图 G = ( V , E ) G=(V,E) G = ( V , E ) 中有 v i ∈ V v_i \in V v i ∈ V ,如果 G − v i G - v_i G − v i 的分支数大于 G G G 的分支数,即在图 G G G 中删去 v i v_i v i 点后 G G G 不再连通,则我们称 v i v_i v i 是 G G G 的一个割点。
每个非平凡图至少有两个顶点不是割点
证明:
由于 G G G 是无环非平凡连通图,所以存在非平凡生成树.非平凡生成树至少两片树叶,它们不能为生成树的割点.显然,它们也不能为 G G G 的割点.
注:非平凡树一定有割边,不一定有割点 (K 2 K_2 K 2 ).
有割点的图不是哈密顿图
【性质】设连通图 G = ( V , E ) G=(V,E) G = ( V , E ) 中有 v i ∈ V v_i \in V v i ∈ V ,则下列命题等价
v i v_i v i 是 G G G 的一个割点
∃ v x , v y ∈ V , v x ≠ v y , v x 与 v y 间 所 有 的 路 均 通 过 v i ∃ v_x,v_y \in V, v_x \ne v_y, v_x 与 v_y 间所有的路均通过 v_i ∃ v x , v y ∈ V , v x = v y , v x 与 v y 间 所 有 的 路 均 通 过 v i
(上一条的普遍推广)∃ V ∖ { v i } 的 划 分 { U , W } ( U ∩ W = ∅ ) , 使 得 ∀ u ∈ U , ∀ w ∈ W : u , w 间 的 路 均 通 过 v i ∃ \; V \setminus \{v_i\} 的划分\{U,W\}(U \cap W = \emptyset),使得\forall u \in U, \forall w \in W: u,w间的路均通过v_i ∃ V ∖ { v i } 的 划 分 { U , W } ( U ∩ W = ∅ ) , 使 得 ∀ u ∈ U , ∀ w ∈ W : u , w 间 的 路 均 通 过 v i
割边(桥)
设图 G = ( V , E ) G=(V,E) G = ( V , E ) 中有 e i ∈ E e_i \in E e i ∈ E ,如果 G − e i G - e_i G − e i 的分支数大于 G G G 的分支数,即在图 G G G 中删去 e i e_i e i 点后 G G G 不再连通,则我们称 e i e_i e i 是 G G G 的一个割边,也称做桥。
【性质】设连通图 G = ( V , E ) G=(V,E) G = ( V , E ) 中有 e i ∈ E e_i \in E e i ∈ E ,则下列命题等价
e i e_i e i 是 G G G 的一个割边
∃ e x , e y ∈ E , e x ≠ e y , e x 与 e y 间 所 有 的 路 均 " 通 过 " e i ∃ e_x,e_y \in E, e_x \ne e_y, e_x 与 e_y 间所有的路均"通过" e_i ∃ e x , e y ∈ E , e x = e y , e x 与 e y 间 所 有 的 路 均 " 通 过 " e i
(上一条的普遍推广)∃ E ∖ { e i } 的 划 分 { U E , W E } ( U E ∩ W E = ∅ ) , 使 得 ∀ u e ∈ U , ∀ w e ∈ W : u e , w e 间 的 路 均 " 通 过 " e i ∃ \; E \setminus \{e_i\} 的划分\{U_E,W_E\}(U_E \cap W_E = \emptyset),使得\forall u_e \in U, \forall w_e \in W: u_e,w_e间的路均"通过"e_i ∃ E ∖ { e i } 的 划 分 { U E , W E } ( U E ∩ W E = ∅ ) , 使 得 ∀ u e ∈ U , ∀ w e ∈ W : u e , w e 间 的 路 均 " 通 过 " e i
e i e_i e i 不在 G G G 的任何圈中
连通度
【性质】
对于不连通或平凡图 G G G :κ ( G ) = λ ( G ) = 0 \kappa (G) = \lambda (G) = 0 κ ( G ) = λ ( G ) = 0
对于树 T T T :κ ( G ) = λ ( G ) = 1 \kappa (G) = \lambda (G) = 1 κ ( G ) = λ ( G ) = 1
对于有割点的图 G G G :κ ( G ) = 1 \kappa (G) = 1 κ ( G ) = 1
对于有割边(桥)的图 G G G :λ ( G ) = 1 \lambda (G) = 1 λ ( G ) = 1
对于完全图 K p K_p K p :κ ( G ) = λ ( G ) = p − 1 \kappa (G) = \lambda (G) = p-1 κ ( G ) = λ ( G ) = p − 1
图 G 连 通 ⇔ κ ( G ) ≥ 1 图G连通 \Leftrightarrow \kappa (G) \ge 1 图 G 连 通 ⇔ κ ( G ) ≥ 1
对于一个环(圈)C n , n ≥ 3 C_n, n ≥ 3 C n , n ≥ 3 :κ ( C n ) = 2 κ(C_n) = 2 κ ( C n ) = 2
除了 κ ( G ) \kappa (G) κ ( G ) 和 λ ( G ) \lambda (G) λ ( G ) 以外,图的最小度 δ ( G ) \delta (G) δ ( G ) 也可以用来描述图 G G G 的连通程度。即
设 G 是 n 阶 简 单 图 , 若 δ ( G ) ≥ ⌊ n 2 ⌋ , 则 G 必 连 通 , 且 λ ( G ) = δ ( G ) . 设 G 是 n 阶简单图,若 δ(G) ≥ ⌊\frac{n}{2}⌋,则 G 必连通,且 λ(G) = δ(G).
设 G 是 n 阶 简 单 图 , 若 δ ( G ) ≥ ⌊ 2 n ⌋ , 则 G 必 连 通 , 且 λ ( G ) = δ ( G ) .
证明:
若 G G G 不连通,则 G G G 至少有两个连通分支,从而必有一个分支 H 满足
∣ V ( H ) ∣ ≤ ⌊ n 2 ⌋ |V(H)| ≤ ⌊\frac{n}{2}⌋
∣ V ( H ) ∣ ≤ ⌊ 2 n ⌋
因 G G G 是简单图,从而
∆ ( H ) ≤ ⌊ n 2 ⌋ − 1 < ⌊ n 2 ⌋ ∆(H) ≤ ⌊\frac{n}{2}⌋ − 1 < ⌊\frac{n}{2}⌋
∆ ( H ) ≤ ⌊ 2 n ⌋ − 1 < ⌊ 2 n ⌋
于是
δ ( G ) ≤ δ ( H ) ≤ ∆ ( H ) < ⌊ n 2 ⌋ δ(G) ≤ δ(H) ≤ ∆(H) < ⌊\frac{n}{2}⌋
δ ( G ) ≤ δ ( H ) ≤ ∆ ( H ) < ⌊ 2 n ⌋
这与已知矛盾,所以 G G G 必连通.
【定理】对任意的图 G = ( V , E ) G=(V,E) G = ( V , E ) ,有
κ ( G ) ≤ λ ( G ) ≤ δ ( G ) κ(G) ≤ λ(G) ≤ δ(G)
κ ( G ) ≤ λ ( G ) ≤ δ ( G )
连通图(Graphe connexe)
在一个无向图 G G G 中,若从顶点 v i { v_{i}} v i 到顶点 v j v_{j} v j 有路径相连 (当然从 v j v_{j} v j 到 $ v_{i}也 一 定 有 路 径 ) , 则 称 也一定有路径),则称 也 一 定 有 路 径 ) , 则 称 v_{i}$ 和 v j v_{j} v j 是**连通 (connexe)**的。
如果 G G G 是有向图 ,那么连接 v i v_{i} v i 和 v j v_{j} v j 的路径中所有的边都必须同向 。
如果图中任意两点都是连通的 ,那么图被称作连通图 。图的连通性是图的基本性质。连通度 是指为了让图分解成孤立的子图所要删除的顶点数的最小值。
设连通图 G G G 有 n n n 个顶点,则该图 G G G 至少 有 n − 1 n-1 n − 1 条边
Proof:
A graph with n n n vertices and no edge has n n n components. Adding an edge reduces the number of components by at most one. So beginning with a graph with no edge, adding one edge at a time till the graph has k k k edges results in reducing the number of components by at most k k k . Thus, a graph with n n n vertices and k k k edges has at least n − k n−k n − k components. Hence every graph with n n n vertices and fewer than n − 1 n-1 n − 1 edges has at least two components, and is disconnected. Therefore every connected graph with n n n vertices must have at least n − 1 n-1 n − 1 edges; the path P n P_n P n is an example of such a graph
弱连通
一个有向图被称作弱连通 (weakly connected )的,如果将所有有向边替换为无向边之后的无向图是连通的,如果对于任意一对顶点 u u u ,v v v ,或者存在一条从 u u u 到 v v v 的有向路径,或者存在一条从 u u u 到 v v v 的有向路径,则该图是单连通 (unilaterally conncected )的。
对 于 任 意 一 对 顶 点 ( u , v ) , 存 在 路 径 u → v , 不 存 在 路 径 v → u 对于任意一对顶点(u,v),\; 存在路径u \to v,\; 不存在路径v\to u
对 于 任 意 一 对 顶 点 ( u , v ) , 存 在 路 径 u → v , 不 存 在 路 径 v → u
强连通
如果对于如果对于任意一对顶点 u u u ,v v v ,同时存在一条从 u u u 到 v v v 的有向路径和一条从 v v v 到 u u u 的有向路径,则该图是强连通 (strongly connected )的
对 于 任 意 一 对 顶 点 ( u , v ) , 存 在 路 径 u → v , 且 存 在 路 径 v → u 对于任意一对顶点(u,v),\; 存在路径u \to v,\; 且存在路径v\to u
对 于 任 意 一 对 顶 点 ( u , v ) , 存 在 路 径 u → v , 且 存 在 路 径 v → u
二元关系
集合 X X X 与集合 Y Y Y 上的二元关系是 R = ( X , Y , G ( R ) ) \mathcal{R}=(X,Y,G(\mathcal{R})) R = ( X , Y , G ( R ) ) ,其中 G ( R ) G(\mathcal{R}) G ( R ) ,称为 R \mathcal{R} R 的图 ,是笛卡儿积 X × Y X\times Y X × Y 的子集。若 ( x , y ) ∈ G ( R ) (x,y) ∈ G(\mathcal{R}) ( x , y ) ∈ G ( R ) ,则称 x 与 y 有 关 系 于 R x\;与\;y\;有关系于 \mathcal{R} x 与 y 有 关 系 于 R ,并记作 x R y x\mathcal{R}y x R y 或 R ( x , y ) \mathcal{R}(x,y) R ( x , y ) 。
否则称 x 与 y 无 关 系 R x \; 与 \; y \; 无关系\mathcal{R} x 与 y 无 关 系 R 。但经常地我们把关系与其图等同起来,即:若 R ⊆ X × Y \mathcal{R}⊆X×Y R ⊆ X × Y ,则 R \mathcal{R} R 是一个关系。
关系的性质
关系的性质主要有以下五种:自反性,反自反性,对称性,反对称性和传递性。
自反性 (réfexivité) :在集合 X X X 上的关系 R \mathcal{R} R ,如对任意 x ∈ E x \in E x ∈ E ,有 ( x , x ) ∈ R (x,x) \in \mathcal{R} ( x , x ) ∈ R ,则称R 是自反的。
∀ x ∈ E , x R x \forall x \in E,\quad x \mathcal{R} x
∀ x ∈ E , x R x
非自反性(自反性的否定的强型式):在集合 X X X 上的关系 R \mathcal{R} R ,如对任意 x ∈ X x\in X x ∈ X ,有 ( x , x ) ∉ R (x,x)\notin R ( x , x ) ∈ / R ,则称R是非自反的。
∀ x ∈ A , ( x , x ) ∉ R \forall x\in A, (x,x)\notin \mathcal{R}
∀ x ∈ A , ( x , x ) ∈ / R
对称性 (symétrie) :在集合 X X X 上的关系 R \mathcal{R} R ,如果有 ( x , y ) ∈ R (x,y) \in \mathcal{R} ( x , y ) ∈ R 则必有 ( y , x ) ∈ R (y,x) \in \mathcal{R} ( y , x ) ∈ R ,则称R是对称的。
∀ ( x , y ) ∈ E 2 , x R y ⇒ y R x \forall (x,y) \in E^2,\quad x \mathcal{R} y \Rightarrow y \mathcal{R} x
∀ ( x , y ) ∈ E 2 , x R y ⇒ y R x
∀ ( x , y ) ∈ E 2 , ( x , y ) ∈ R ⇒ ( y , x ) ∉ R \forall (x,y) \in E^2, \quad (x,y) \in \mathcal{R} \Rightarrow (y,x) \notin \mathcal{R}
∀ ( x , y ) ∈ E 2 , ( x , y ) ∈ R ⇒ ( y , x ) ∈ / R
∀ ( x , y ) ∈ E 2 , ( ( x R y ) ∧ ( y R x ) ⇒ x = y ) \forall (x,y) \in E^2, \quad ((x \mathcal{R} y) \land (y \mathcal{R} x) \Rightarrow x=y)
∀ ( x , y ) ∈ E 2 , ( ( x R y ) ∧ ( y R x ) ⇒ x = y )
∀ ( x , y , z ) ∈ E 3 , ( ( x R y ) ∧ ( y R z ) ⇒ x R z \forall (x,y,z) \in E^3, \quad ((x \mathcal{R} y) \land (y \mathcal{R} z) \Rightarrow x \mathcal{R} z
∀ ( x , y , z ) ∈ E 3 , ( ( x R y ) ∧ ( y R z ) ⇒ x R z
设 R \mathcal{R} R 为集合 E E E 上的关系,下面给出 R \mathcal{R} R 的五种性质成立的充要条件 :
R \mathcal{R} R 在 E E E 上自反,当且仅当I E ⊆ R I_{E}\subseteq \mathcal{R} I E ⊆ R
R \mathcal{R} R 在 E E E 上非自反,当且仅当 $\mathcal{R} \cap I_{E}=\emptyset $
R \mathcal{R} R 在 E E E 上对称,当且仅当 R = R − 1 \mathcal{R} = \mathcal{R} ^{-1} R = R − 1
R \mathcal{R} R 在 E E E 上反对称,当且仅当 $ \mathcal{R} \cap \mathcal{R}^{-1}\subseteq I_{E}$
R \mathcal{R} R 在 E E E 上非对称,当且仅当 R ∩ R − 1 = ∅ \mathcal{R} \cap \mathcal{R}^{-1}= \emptyset R ∩ R − 1 = ∅
R \mathcal{R} R 在 E E E 上传递,当且仅当 R ∘ R ⊆ R \mathcal{R} \circ \mathcal{R}\subseteq \mathcal{R} R ∘ R ⊆ R
等价关系( Relation d’équivalence)
等价关系 也称为同值关系(英语:Equivalence relation)即设 R \mathcal{R} R 是某个集合 E E E 上的一个二元关系。若 R \mathcal{R} R 满足以下条件(充分必要):
自反性 (réfexivité):∀ x ∈ E , x R x \forall x \in E, \quad x \mathcal{R} x ∀ x ∈ E , x R x
对称性 (symétrie):∀ ( x , y ) ∈ E 2 , x R y ⇒ y R x \forall (x,y) \in E^2, \quad x \mathcal{R} y \Rightarrow y \mathcal{R}x ∀ ( x , y ) ∈ E 2 , x R y ⇒ y R x
传递性 (transitivité):∀ ( x , y , z ) ∈ E 3 , ( ( x R y ) ∧ ( y R z ) ⇒ x R z \forall (x,y,z) \in E^3, \quad ((x \mathcal{R} y) \land (y \mathcal{R} z) \Rightarrow x \mathcal{R} z ∀ ( x , y , z ) ∈ E 3 , ( ( x R y ) ∧ ( y R z ) ⇒ x R z
例如,设 E = 1 , 2 , . . . , 8 E={1,2,...,8} E = 1 , 2 , . . . , 8 ,定义 E E E 上的关系 R \mathcal{R} R 如下:
x R y ⟺ ∀ ( x , y ) ∈ E , x ≡ y ( m o d 3 ) x \mathcal{R} y \Longleftrightarrow \forall (x,y) \in E, x \equiv y(mod \; 3)
x R y ⟺ ∀ ( x , y ) ∈ E , x ≡ y ( m o d 3 )
其中,x ≡ y ( m o d 3 ) x \equiv y(mod \; 3) x ≡ y ( m o d 3 ) 叫做 x x x 与 y 模 3 y模3 y 模 3 同余,即 x x x 除以3的余数 与 y y y 除以3的余数相等。例子有1 R 4 1\mathcal{R} 4 1 R 4 ,2 R 5 2\mathcal{R}5 2 R 5 ,3 R 6 3\mathcal{R}6 3 R 6 。不难验证 R \mathcal{R} R 为 E E E 上的等价关系。
并非所有的二元关系都是等价关系。一个简单的反例是比较两个数中哪个较大 :
没有自反性:任何一个数不能比自身为较大 n ≯ n n\ngtr n n ≯ n
没有对称性:如果 m > n m>n m > n ,就肯定不能有 n > m n>m n > m
等价类(Classe d’équivalence)
令 R \mathcal{R} R 是集合 E E E 上的等价关系,x x x 是 E E E 的元素。我们称 x x x 的等价类为 E E E 中与 x x x 相关的所有元素的集 [ x ] [x] [ x ] :
[ x ] = y ∈ E , x R y [x] = {y ∈ E,x\mathcal{R}y}
[ x ] = y ∈ E , x R y
设 R \mathcal{R} R 为集合 E E E 上的等价关系,两个等价类不相交或相等。
证明:
I F ( v k = { v j } ∪ { v i } ) T H E N ( v i R v k , v j R v k ⇒ v i R v j ⇒ [ v i ] = [ v j ] ) E L S E ( { v j } ∩ { v i } = ∅ ) \begin{aligned} IF (v_k = \{v_j\} \cup \{v_i\}) \quad
& THEN(v_i \mathcal{R} v_k,\;v_j \mathcal{R} v_k \Rightarrow v_i \mathcal{R} v_j \Rightarrow [v_i]=[v_j]) \\
& ELSE(\{v_j\} \cap \{v_i\} = \emptyset)
\end{aligned}
I F ( v k = { v j } ∪ { v i } ) T H E N ( v i R v k , v j R v k ⇒ v i R v j ⇒ [ v i ] = [ v j ] ) E L S E ( { v j } ∩ { v i } = ∅ )
设 R \mathcal{R} R 是集合 E E E 上的等价关系,等价类的集合是 E E E 的一个部分。
设 G G G 是一个无向图(或有向图),当且仅当存在一条连接 v i v_i v i 到 v j v_j v j 的链(分别是从 v i v_i v i 到 v j v_j v j 的路径和从 v j v_j v j 到 v i v_i v i 的路径)时,由 v i R v j v_i \mathcal{R} v_j v i R v j 在顶点集上定义的关系 R \mathcal{R} R 到 v i v_i v i 是等价关系。
连通分量(Composantes connexes)
无向图 G G G 的极大连通子图 称为 G G G 的连通分量 ( Connected Component)。任何连通图的连通分量只有一个,即是其自身,非连通的无向图有多个连通分量。对于分量中任意两点 u , v u,v u , v ,必然可以从 u u u 走到 v v v ,且从 v v v 走到 u u u 。
如下图所示,
强连通分量(Composantes fortement connexes)
有向图 G = ( V , E ) G= (V,E) G = ( V , E ) 的极大强连通子图 称为 G G G 的强连通分量 ,强连通图只有一个强连通分量,即是其自身。非强连通的有向图有多个强连通分量。极大连通分量。一个连通分量加上任何一些点都不是连通分量了,该连通分量就是强连通分量。
强连通分量的作用: 将任意有向图通过 缩点(将所有连通分量缩成一个点) 转换成有向无环图( D A G DAG D A G )。如下图所示,
前驱:P r e d ( S ⊆ V e r t e x ) = { v ′ ∣ v ∈ S , ( v ′ , v ) ∈ E d g e } Pred (S \subseteq V_{ertex}) = \{v' | v \in S, (v',v) \in E_{dge}\} P r e d ( S ⊆ V e r t e x ) = { v ′ ∣ v ∈ S , ( v ′ , v ) ∈ E d g e }
后继:S u c c ( S ⊆ V e r t e x ) = { v ′ ∣ v ∈ S , ( v , v ′ ) ∈ E d g e } Succ (S \subseteq V_{ertex}) = \{v' | v \in S, (v,v') \in E_{dge}\} S u c c ( S ⊆ V e r t e x ) = { v ′ ∣ v ∈ S , ( v , v ′ ) ∈ E d g e }
我们还通过以下方式定义前驱 和后继 的自反和传递闭包:
P r e d ∗ ( S ⊆ V e r t e x ) = S ∪ P r e d ∗ ( P r e d ( S ) ) Pred^* (S \subseteq V_{ertex}) = S \cup Pred^* (Pred(S)) P r e d ∗ ( S ⊆ V e r t e x ) = S ∪ P r e d ∗ ( P r e d ( S ) )
S u c c ∗ ( S ⊆ V e r t e x ) = S ∪ S u c c ∗ ( S u c c ( S ) ) Succ^* (S \subseteq V_{ertex}) = S \cup Succ^* (Succ(S)) S u c c ∗ ( S ⊆ V e r t e x ) = S ∪ S u c c ∗ ( S u c c ( S ) )
Demoucron 算法
1 2 3 4 5 6 7 CFG_G <- ∅空集 WHILE (有一个顶点不在 CFC_G 子集的并集中) DO 选择 v ∈ V 不出现 CFC_G 子集的并集 CFC_v <- SUCC*({v}) ∩交集 Pred*({v}) CFC_G <- CFC_G ∪并集 {CFC_v} END
例:应用 Demoucron 算法找出下图中的强连通分量:
C F C G = ∅ CFC_G = \emptyset C F C G = ∅
C F C v 1 = { 1 , 2 , 3 , 7 , 5 , 6 , 8 , 4 , 10 , 9 } ← 顺 箭 头 方 向 S u c c ∩ { 1 , 4 , 5 , 3 , 6 , 2 , 7 , 9 , 10 } ← 逆 箭 头 方 向 P r e d = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 9 , 10 } \begin{aligned} CFC_{v_1} & = \{1,2,3,7,5,6,8,4,10,9\} \quad \leftarrow 顺箭头方向_{Succ} \\ & \quad \cap \; \{ 1,4,5,3,6,2,7,9,10\} \quad \leftarrow 逆箭头方向_{Pred} \\ & = \{ 1,2,3,4,5,6,7,9,10\} \end{aligned} C F C v 1 = { 1 , 2 , 3 , 7 , 5 , 6 , 8 , 4 , 1 0 , 9 } ← 顺 箭 头 方 向 S u c c ∩ { 1 , 4 , 5 , 3 , 6 , 2 , 7 , 9 , 1 0 } ← 逆 箭 头 方 向 P r e d = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 9 , 1 0 }
v 8 并 不 在 上 一 轮 的 C F C v 中 v_8 \;并不在上一轮的\;CFC_v 中 v 8 并 不 在 上 一 轮 的 C F C v 中
C F C G = { [ 1 ] , [ 8 ] } → { [ 8 ] } s e u l CFC_G = \{ [1] , [8] \} \rightarrow \{ [8] \}_{seul} C F C G = { [ 1 ] , [ 8 ] } → { [ 8 ] } s e u l
树(Arbre)
树 是一个无环连通图 。森林 由若干个树连接 得来(无环)。
由 k k k 颗树组成的森林满足 m = n − k m = n − k m = n − k ,其中 n n n 为 G G G 的顶点数,m m m 为 G G G 的边数.
Theorem:
每 棵 非 平 凡 树 至 少 有 两 片 树 叶 每棵非平凡树至少有两片树叶
每 棵 非 平 凡 树 至 少 有 两 片 树 叶
证明 :
设 d 1 ≤ d 2 ≤ ⋅ ⋅ ⋅ ≤ d n d_1 ≤ d_2 ≤ · · · ≤ dn d 1 ≤ d 2 ≤ ⋅ ⋅ ⋅ ≤ d n 是树 T T T 的度序列,因为 T T T 是连通的,所以树 T T T 的最小度 δ ( T ) = d 1 ≥ 1 δ(T) = d_1 ≥ 1 δ ( T ) = d 1 ≥ 1 . 如果树 T T T 中至多有一片树叶,那么 2 n − 2 = 2 m ( T ) = ∑ i = 1 n d i ≥ 1 + 2 ( n − 1 ) 2n − 2 = 2m(T) = \sum_{i=1}^n d_i ≥ 1 + 2(n − 1) 2 n − 2 = 2 m ( T ) = ∑ i = 1 n d i ≥ 1 + 2 ( n − 1 ) , 出现矛盾.
n : = NB of vertex m : = NB of Edge t : = NB of vertex with 1 degre ∵ G is a tree ∴ G is a connected graph ∴ ∑ δ ( v ) = 2 m = 2 ( n − 1 ) according to n=m-1 ∵ ∑ δ ( v ) ≥ 2 δ ( v ) ≥ 2 ( n − t ) + t ∴ 2 ( n − 1 ) ≥ 2 ( n − t ) + t ⇒ t ≥ 2 n := \text{NB of vertex}\\
m := \text{NB of Edge}\\
t := \text{NB of vertex with 1 degre}\\
\because \text{G is a tree}\quad
\therefore \text{G is a connected graph}\\
\therefore \sum \delta(v) = 2m = 2(n-1) \quad \text{according to n=m-1} \\
\because \sum_{\delta(v) \ge 2} \delta(v) \ge 2(n-t)+t \\
\therefore 2(n-1) \ge 2(n-t)+t \quad \Rightarrow \quad t \ge 2
n : = NB of vertex m : = NB of Edge t : = NB of vertex with 1 degre ∵ G is a tree ∴ G is a connected graph ∴ ∑ δ ( v ) = 2 m = 2 ( n − 1 ) according to n=m-1 ∵ δ ( v ) ≥ 2 ∑ δ ( v ) ≥ 2 ( n − t ) + t ∴ 2 ( n − 1 ) ≥ 2 ( n − t ) + t ⇒ t ≥ 2
设 G G G 是具有 n n n 个点 m m m 条边的图,则下列命题等价 :
G G G 是树;
G G G 无环 且任意两个不同点之间存在唯一的路;
G G G 连通,删去任一边便不连通;
G G G 连通 ,且 n = m − 1 n = m - 1 n = m − 1 ;
G G G 无圈 ,且 n = m − 1 n = m - 1 n = m − 1 ;
G G G 无圈,添加任何一条边可得唯一 的圈。
生成树
G G G 的生成树 (arbre couvrant)是具有 G G G 的全部顶点 ,但边数最少 的连通子图 。
若有图 G = ( V G , E G ) G=(V_G, E_G) G = ( V G , E G ) 和树 T = ( V T , E T ) T = (V_T, E_T) T = ( V T , E T ) ,有 V T = V G V_T = V_G V T = V G 且 E T ⊂ E G E_T \subset E_G E T ⊂ E G ,那么我们说树 T T T 是图 G G G 的生成树。
最小生成树
带权图的生成树中,总权重最小的称为最小生成树 。
求取最小生成树的算法:一种贪心算法
新建图 G G G , G G G 中拥有原图中相同的节点,但没有边;
将原图中所有的边按权值从小到大升序 ;
从权值最小的边开始 ,如果这条边连接的两个节点于图 G G G 中不在同一个连通分量中,则添加这条边到图 G G G 中;
重复3,直至图 G G G 中所有的节点都在同一个连通分量中;
第三部分:Euler 图与 Hamilton 图
欧拉图
Theorem
假定 G G G 是一个连通图 ,则下列命题等价:
G G G 是欧拉图 ;
G G G 的每个点的度都是偶数 或 只有 2 个顶点是奇数度,其余均为偶数度 ;
连通无向图 G G G 是欧拉图当且仅当 G G G 的每个顶点都是偶度顶点
连通无向图 G G G 中存在连接顶点 u , v u,v u , v 的欧拉链当且仅当只有 u u u 和 v v v 是奇度顶点
G G G 的边集能划分为边不重的环的并。
性质
无向图
连通无向图 G G G 是欧拉图当且仅当 G G G 的每个顶点都是偶度顶点
连通无向图 G G G 中存在连接顶点 u , v u,v u , v 的欧拉链当且仅当只有 u u u 和 v v v 是奇度顶点
有向图
强连通图有向图 D D D 是欧拉回路 当且仅当 D D D 中的**每个顶点的出度数和入读数相同 **
单向连通有向图 D D D 有从顶点 u u u 到 v v v 的欧拉通路 当且仅当 u u u 的出度数 比入度数大 1 , v v v 的入度数 比出度数 大 1 , D D D 中其他顶点入度数 和出度数 相同
寻找 Euler 回路算法:Hierholzer 算法
Hierholzer算法用于在连通图寻找欧拉迹,其流程非常简单。
从一个可能的起点出发,进行深度优先搜索 ,但是每次沿着辅助边从某个顶点移动到另外一个顶点的时候,都需要删除这个辅助边。如果没有可移动的路径,则将所在结点加入到栈中,并返回。
最后得到的栈中保存的就是整个欧拉闭迹中的顶点。
1 2 3 4 5 6 7 dfs(node, trace){ while (!node.adj.isEmpty()){ Node next = node.adj.removeLast(); dfs(next, trace); } trace.addLast(node); }
哈密顿图
性质
若存在 v i ∈ V v_i \in V v i ∈ V ,当 v i v_i v i 的度数 δ ( v i ) = 1 \delta(v_i) =1 δ ( v i ) = 1 且阶数 n > 1 n>1 n > 1 时,不为哈密顿图
若存在 v i ∈ V v_i ∈ V v i ∈ V ,当 v i v_i v i 的度数 δ ( v ) = 2 δ(v) = 2 δ ( v ) = 2 ,那么与 v i v_i v i 相关的两条边属于任何哈密顿环。
K n K_n K n 是哈密顿图
有向完全图中必存在哈密顿通路
强连通的有向完全图中必存在哈密顿回路
哈密顿图的判断方法
Theorem (Ore,充分条件)
对于阶 n ≥ 3 n ≥ 3 n ≥ 3 的简单图 G G G ,如果 G G G 中的任意 两个不相邻顶点 u u u 与 v v v ,都有:
δ ( u ) + δ ( v ) ≥ n , \delta(u) + \delta(v) ≥ n,
δ ( u ) + δ ( v ) ≥ n ,
那么 G G G 是哈密顿图。( 注:上述定理只是充分条件,而非必要条件,例如长度为 5 的圈.)
证明 :
等效地表明,每个非哈密顿图G都不满足条件。因此,令 G G G 为非哈密顿图的 n ≥ 3 n≥3 n ≥ 3 个顶点上的图,并通过一次不增加哈密顿边数加一个边,由 G G G 形成 H H H ,直到无法再增加边。
令 u u u 和 v v v 为 H H H 中的任何两个不相邻的顶点。然后将边 ( u , v ) (u, v) ( u , v ) 添加到 H H H ,将创建至少一个新的哈密顿回路,并且在 H H H 中的此回路中的 ( u , v ) (u,v) ( u , v ) 以外的边一定会形成哈密顿路径 v 1 , v 2 , . . . v n v_1, v_2, ... v_n v 1 , v 2 , . . . v n ,其中 u = v 1 u = v_1 u = v 1 ,v = v n v = v_n v = v n 。
对于 2 ≤ i ≤ n 2≤i≤n 2 ≤ i ≤ n 范围内的每个指数 i i i ,考虑 H H H 中从 v 1 v_1 v 1 到 v i v_i v i 和从 v ( i − 1 ) v_(i-1) v ( i − 1 ) 到 v n v_n v n 的两个可能边。在 H H H 中最多可以存在这两个边之一,否则周期 v 1 , v 2 . . . v ( i − 1 ) , v n , v ( n − 1 ) . . . v i v_1,v_2 ... v_(i-1), v_n, v_{(n-1)} ... v_i v 1 , v 2 . . . v ( i − 1 ) , v n , v ( n − 1 ) . . . v i 将是哈密顿回路。
因此,入射到 v 1 v_1 v 1 或 v n v_n v n 的边的总数最多等于 i i i 的选择数,即 n − 1 n-1 n − 1 。因此,H H H 不服从属性,这要求该边的总数 δ ( v 1 ) + δ ( v n ) δ(v_1) + δ(v_n) δ ( v 1 ) + δ ( v n ) 大于或等于 n n n 。由于 G G G 的顶点度最多等于 H H H 的度数,因此得出 G G G 也没有服从特性的结论。
Theorem (Dirac,充分条件)
对于 n ≥ 3 n ≥ 3 n ≥ 3 的简单图 G G G ,如果 G G G 中有:
δ ( G ) ≥ n 2 \delta(G) ≥ \frac{n}{2}
δ ( G ) ≥ 2 n
那么 G G G 是哈密顿图。( 注:上述定理只是充分条件,而非必要条件,例如长度为 5 的圈.)
二分图(Graphe biparti)
二分图又称作二部图,是图论中的一种特殊模型。 设 G = ( V , E ) G=(V,E) G = ( V , E ) 是一个无向图,如果顶点 V V V 可分割为两个互不相交的子集 A A A ,B B B ),并且图中的每条边 ( v i , v j ) (v_i, v_j) ( v i , v j ) 所关联的两个顶点 v i v_i v i 和 $v_j $ 分别属于这两个不同的顶点集 (v i ∈ A v_i \in A v i ∈ A , v j ∈ B v_j \in B v j ∈ B ),则称图 G G G 为一个二分图 。
简而言之,就是顶点集 V V V 可分割为两个互不相交的子集 ,并且图中每条边依附的两个顶点都分属于这两个互不相交的子集,两个子集内的顶点不相邻 。
如下图,
完全二分图:V 1 V_1 V 1 的所有顶点都链接到 V 2 V_2 V 2 的任何顶点。互补顶点子集分别有 p p p 个顶点和 q q q 个顶点的完全二分图记为 𝐾 𝑝 , 𝑞 𝐾_{𝑝,𝑞} K p , q
性质
如果一个图 G = ( V , E ) G=(V,E) G = ( V , E ) 是二分图,且 ∣ n b ( V 1 ) − n b ( V 2 ) ∣ > 1 | nb(V_1) - nb(V_2)| > 1 ∣ n b ( V 1 ) − n b ( V 2 ) ∣ > 1 ,则 G G G 即不是哈密顿图,也不是半哈密顿图
若无向图 G G G 中有长度为奇数的闭合链,则在 G G G 中有长度为奇数的圈
非平凡无向图 G G G 是二分图当且仅当 G G G 中的每个圈的长度都是偶数
第四部分:最短路径问题
Dijkstra 最短路径算法
Dijkstra算法是一种经典的基于贪心 的单源最短路算法,其要求图中的边全部非负。
算法描述
1. 算法思想:
设 G = ( V , E ) G=(V,E) G = ( V , E ) 是一个带权有向图(或无向图),把图中顶点集合 V V V 分成两组,
第一组为已求出最短路径的顶点集合 (用 S S S 表示,初始时 S S S 中只有一个源点 ,以后每求得一条最短路径 , 就将加入到集合 S S S 中,直到全部顶点都加入到 S S S 中,算法就结束了),
第二组为其余未确定最短路径的顶点集合 (用 U U U 表示),按最短路径长度的递增次序依次把第二组的顶点加入 S S S 中。在加入的过程中,总保持从源点 v 0 v_0 v 0 到 S S S 中各顶点的最短路径长度不大于从源点 v 0 v_0 v 0 到 U U U 中任何顶点的最短路径长度。
此外,每个顶点对应一个距离,S S S 中的顶点的距离就是从 v 0 v_0 v 0 到此顶点的最短路径长度,U U U 中的顶点的距离,是从 v 0 v_0 v 0 到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。
2. 算法伪代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 DIJKSTRA(G, w, s) // s的当前最短路长度是0,其他节点的当前最短路长度是+∞。 INITIALIZE-SINGLE-SOURCE(G, s) // S是节点集合(V的子集),其中每个节点u都已经求得了全图最短路。 // 初期所有节点都没求得全图最短路。 S ← ∅ // Q是一个节点的优先队列,包含所有尚未求得全图最短路的节点。Q中的节点按照当前最短路的长度从小到大排序。 // 初期所有节点都没求得全图最短路,所以都在Q中。 Q ← V[G] // 循环直到Q中所有节点都清空(都移动到S),即所有节点都已经求出全图最短路。 while Q ≠ ∅ // 从Q中取出当前最短路长度最小的节点u // 并认为u的当前最短路就是全图最短路。(这个不是那么显然,后续有说明) do u ← EXTRACT-MIN(Q) // 将u放进集合S中,即标注为“已求得u的全图最短路”。 S ← S∪{u} // 对于u的每个邻接点v for each vertex v∈Adj[u] // 更新v的当前最短路。 // 具体策略是:有一个从s到v的新路径,即“从s走全图最短路到u,再从u到v”。 // 这个新路径可能比v的当前最短路长,也可能比v的当前最短路短。(这个不那么显然,后续有说明) // 如果新路径比v的当前最短路短,就把v的当前最短路替换为这条新路径。 do RELAX(u, v, w)
3. 算法步骤:
初始时,S S S 只包含源点,即 S = { v 0 } S=\{v_0\} S = { v 0 } ,v 0 v_0 v 0 的距离为 0 0 0 。U U U 包含除 v 0 v_0 v 0 外的其他顶点,即 : U = { 其 余 顶 点 } U=\{其余顶点\} U = { 其 余 顶 点 } ,若 v 0 v_0 v 0 与 U U U 中顶点 v i v_i v i 有边,则 ( v 0 , v i ) (v_0,v_i) ( v 0 , v i ) 正常有权值,若 v 0 v_0 v 0 不是 v i v_i v i 的出边邻接点,则 ( v 0 , v i ) (v_0,v_i) ( v 0 , v i ) 权值为 ∞ ∞ ∞ 。
从 U U U 中选取一个距离 v 0 v_0 v 0 最小的顶点 v k v_k v k ,把 v k v_k v k 加入 S S S 中(该选定的距离就是 v 0 v_0 v 0 到 v k v_k v k 的最短路径长度)。
以 v k v_k v k 为新考虑的中间点,修改 U U U 中各顶点的距离;若从源点 v 0 v_0 v 0 到顶点 v i v_i v i 的距离(经过顶点 v k v_k v k )比原来距离(不经过顶点 v k v_k v k )短,则修改顶点 v i v_i v i 的距离值,修改后的距离值的顶点 v k v_k v k 的距离加上边上的权。
重复步骤 2 和 3,直到所有顶点都包含在 S S S 中。
例:如下图所示,求出从 0 出发到 4 的最短路径。
【思路】 :
每次从没标记的节点中选择距离出发点最近的节点标记、收录到最优路径集合中;
计算刚加入的节点 A 到临近节点 B 的距离(不包含已标记节点),若 ( 节 点 A 的 距 离 + 节 点 A 到 节 点 B 的 距 离 ) < 节 点 B 的 距 离 (节点A的距离 + 节点A到节点B的距离) < 节点B的距离 ( 节 点 A 的 距 离 + 节 点 A 到 节 点 B 的 距 离 ) < 节 点 B 的 距 离 ,则选择更小的那个路径,更新节点B的距离和前驱点pred
标记完所有的节点
【解】
将 [0] 放入集合:
0
[1]
2
3
4
5
6
7
8
dist
0
4
∞ ∞ ∞
∞ ∞ ∞
∞ ∞ ∞
∞ ∞ ∞
∞ ∞ ∞
8
∞ ∞ ∞
pred
\
0
\
\
\
\
\
0
\
将 [1] 放入集合:
0
1
2
3
4
5
6
[7]
8
dist
0
4
12
∞ ∞ ∞
∞ ∞ ∞
∞ ∞ ∞
∞ ∞ ∞
8 ∗ 8^* 8 ∗
∞ ∞ ∞
pred
\
0
1
\
\
\
\
0
\
注意⚠️:* 路径 0 → 1 → 7 0 \to 1 \to 7 0 → 1 → 7 的距离为 4 + 11 = 15 4+11=15 4 + 1 1 = 1 5 ,而有路径 0 → 7 0 \to 7 0 → 7 的距离为 8,小于前者。所以我们选择路径 0 → 7 0 \to 7 0 → 7 ,并更新表。以下步骤与此类次,不再单独列出。
将 [7] 放入集合:
0
1
2
3
4
5
[6]
7
8
dist
0
4
12
∞ ∞ ∞
∞ ∞ ∞
∞ ∞ ∞
9
8
15
pred
\
0
1
\
\
\
7
0
7
将 [6] 放入集合:
0
1
2
3
4
[5]
6
7
8
dist
0
4
12
∞ ∞ ∞
∞ ∞ ∞
11
9
8
15
pred
\
0
1
\
\
6
7
0
7
将 [5] 放入集合:
0
1
[2]
3
4
5
6
7
8
dist
0
4
12
25
21
11
9
8
15
pred
\
0
1
5
5
6
7
0
7
将 [2] 放入集合:
0
1
2
3
4
5
6
7
[8]
dist
0
4
12
19
21
11
9
8
14
pred
\
0
1
2
5
6
7
0
2
将 [8] 放入集合:由于与 8 相邻的节点都已经加入集合,所以可以跳过这一步
0
1
2
[3]
4
5
6
7
8
dist
0
4
12
19
21
11
9
8
14
pred
\
0
1
2
5
6
7
0
2
将 [3] 放入集合:
0
1
2
3
[4]
5
6
7
8
dist
0
4
12
19
21
11
9
8
14
pred
\
0
1
2
5
6
7
0
2
将 [4] 放入集合:
0
1
2
3
4
5
6
7
8
dist
0
4
12
19
21
11
9
8
14
pred
\
0
1
2
5
6
7
0
2
遍历完毕,我们现在就得到了从 0 到该图中所有点的最短路程 (shortest distance)。欲求出 0 → 4 0 \to 4 0 → 4 的路径,我们可以从 4 出发,沿着 pred 的顺序到推出最短路径 (shortest path),即
4 ← 5 ← 6 ← 7 ← 0 4 \leftarrow 5 \leftarrow 6 \leftarrow 7 \leftarrow 0
4 ← 5 ← 6 ← 7 ← 0
对于有向图 ,大体思路与无向图一致,注意边的方向即可,顺方向为可达,逆方向为不可达(即 ∞ ∞ ∞ )
第五部分:平面图 及 图的上色问题
平面图(Graphe planire)
如下图,如果一个图 G G G 可以在平面上 绘制,并且其边不相交 (边不一定是直线),则称该图是平面图 。
平面图所在的特定平面称为地图(carte);
将地图划分为几个区域称为面(face);
内部面:每个区域内部连同边界称为 G G G 的内部面
外部面:无界的区域
注:每个平面图有且仅有一个外部面。
而如果一个图无论怎样都无法画在平面上,并使得不同的边互不交叠,那么这样的图不是平面图,或者称为非平面图。
完全图 K 5 K_5 K 5 和完全二分图 K 3 , 3 K_{3,3} K 3 , 3 (汤玛森图) 是最“小”的非平面图。
面的次数:设 f f f 是 G G G 的一个面,构成 f f f 的边界的边数 (割边算两次)称为 f f f 的次数 , 记作 d e g ( f ) deg(f) d e g ( f )
这实际上是一个研究图的拓扑方面的问题。 更一般地,人们可以问一个图形是否可以在表面 S 上表示的问题
欧拉公式
设 G G G 是具有 n n n 个顶点,m m m 条边,f f f 个面,p p p 个连通分支 (composantes connexes) 的平面图,则:
f = m − n + 1 + p 即 面 数 = 边 数 − 顶 点 数 + 1 + 连 通 部 分 的 数 量 f = m-n+1+p \quad 即 \quad 面数=边数-顶点数+1+连通部分的数量
f = m − n + 1 + p 即 面 数 = 边 数 − 顶 点 数 + 1 + 连 通 部 分 的 数 量
【欧拉示性数 (Euler characteristic)】 :具有 n n n 个顶点 m m m 条边 f f f 个面的连通平面图 G G G 满足:
n − m + f = 2 , 即 顶 点 数 − 边 数 + 面 数 = 2 n-m+f=2,\quad 即 \quad 顶点数-边数+面数=2
n − m + f = 2 , 即 顶 点 数 − 边 数 + 面 数 = 2
【推论】具有 n n n 个顶点,m m m 条边的简单可平面图,若 n ≥ 3 n \ge 3 n ≥ 3 ,则 m ≤ 3 n − 6 m \le 3n -6 m ≤ 3 n − 6
极大可平面图
【定义】设 G G G 是简单可平面图,如果在 G G G 中的任意两个不相邻的顶点 之间添加一条边所得到的图均为不可平面图 ,则称该图 G G G 为极大可平面图。
(必要条件)G G G 是极大可平面图,则 G G G 一定是连通图;如果 G G G 的阶数大于3,则 G G G 无割边
设 G G G 是至少有3个顶点的平面图,则 G G G 是极大平面图的充要条件 是 G G G 中各个面的次数均为3 且 为简单图
设 G G G 是具有 n n n 个顶点,m m m 条边,f f f 个面的极大平面图,则 m = 3 n − 6 m=3n-6 m = 3 n − 6 ,f = 2 n − 4 f =2n-4 f = 2 n − 4
图的顶点着色
【独立集】(Independent ensemble)是图论中的概念。一个独立集(也称为稳定集 stable ensemble)是一个图中一些两两不相邻的顶点所形成的集合 。换句话说,独立集 S S S 由图中若干顶点组成,且 S S S 中任两个顶点之间没有边。我们用 α ( G ) \alpha (G) α ( G ) 表示稳定即的个数。
【着色】在一个图 G G G 中,任意相邻的两个顶点不能着相同的颜色 (即一条边两端的顶点不能着相同的颜色;也即当一个图的顶点可分为 n n n 个独立集时,可着 n n n 个颜色)。我们用 γ ( G ) \gamma (G) γ ( G ) 表示颜色的个数。
如果一个图所需颜色 γ ( G ) \gamma (G) γ ( G ) 的最小数量是 k k k ,则我们称该图是 k − 点 可 着 色 的 k-点可着色的 k − 点 可 着 色 的
常见的图的着色所需颜色的数量:
γ ( K p ) = p \gamma (K_p) = p γ ( K p ) = p
γ ( 具 有 2 n 个 顶 点 的 环 ) = 2 \gamma (具有2n个顶点的环) = 2 γ ( 具 有 2 n 个 顶 点 的 环 ) = 2
γ ( 具 有 2 n + 1 个 顶 点 的 环 ) = 3 \gamma (具有2n+1个顶点的环) = 3 γ ( 具 有 2 n + 1 个 顶 点 的 环 ) = 3
γ ( T r e e ) = 2 \gamma (Tree) = 2 γ ( T r e e ) = 2
例:
上图 G G G 所示的独立集为 { 0 } , { 1 } , { 2 , 3 , 4 } \{0\},\quad \{1\}, \quad \{2,3,4\} { 0 } , { 1 } , { 2 , 3 , 4 }
α ( G ) = 3 \alpha (G) = 3 α ( G ) = 3 , γ ( G ) = 3 \gamma (G) = 3 γ ( G ) = 3
色数的上下界
下界 (1)
γ ( G ) ≥ n b ( V ) n b ( V ) − m i n v ∈ V δ ( v ) \gamma (G) \ge \frac {nb(V)}{nb(V) - min_{v \in V} \delta(v)}
γ ( G ) ≥ n b ( V ) − m i n v ∈ V δ ( v ) n b ( V )
其中,
m i n v ∈ V δ ( v ) min_{v \in V} \delta(v) m i n v ∈ V δ ( v ) 是图 G G G 中拥有最小度的顶点 v v v 的度数 ,即 在一个图中,拥有最少相邻顶点的顶点 v v v 的度数;
n b ( V ) − m i n v ∈ V δ ( v ) − 1 nb(V) - min_{v \in V} \delta(v) - 1 n b ( V ) − m i n v ∈ V δ ( v ) − 1 是与顶点 v v v 不邻接的顶点数 ,而此时就可以知道最多的同色顶点数 是 n b ( V ) − m i n v ∈ V δ ( v ) nb(V) - min_{v \in V} \delta(v) n b ( V ) − m i n v ∈ V δ ( v )
总共色数是 γ ( G ) \gamma (G) γ ( G ) ,其与最多的同色顶点数 n b ( V ) − m i n v ∈ V δ ( v ) nb(V) - min_{v \in V} \delta(v) n b ( V ) − m i n v ∈ V δ ( v ) 相乘,应该小于等于 顶点数 n b ( V ) nb(V) n b ( V ) ,即 γ ( G ) × n b ( V ) − m i n v ∈ V δ ( v ) ≤ n b ( V ) \gamma (G) \times nb(V) - min_{v \in V} \delta(v) \le nb(V) γ ( G ) × n b ( V ) − m i n v ∈ V δ ( v ) ≤ n b ( V )
整理可得出上式
下界 (2)
γ ( G ) ≥ # ( 最 大 团 ( c l i q u e ) 中 的 顶 点 数 ) \gamma (G) \ge \#(最大团_{(clique)}中的顶点数)
γ ( G ) ≥ # ( 最 大 团 ( c l i q u e ) 中 的 顶 点 数 )
上界 (1)
γ ( G ) ≤ m a x v ∈ V δ ( v ) + 1 \gamma (G) \le max_{v \in V} \delta(v) + 1
γ ( G ) ≤ m a x v ∈ V δ ( v ) + 1
其中,
m a x v ∈ V δ ( v ) max_{v \in V} \delta(v) m a x v ∈ V δ ( v ) 是图 G G G 中拥有最大度的顶点 v v v 的度数 ,也可写作 Δ ( G ) \Delta (G) Δ ( G ) 。即 在一个图中,拥有最多相邻顶点的顶点 v v v 的度数;
证明:(数学归纳法)
当 n = 1 或 2 n=1或2 n = 1 或 2 时,结论显然成立;
假设有 p p p 个顶点时结论成立,当有 p + 1 p+1 p + 1 个顶点时,假设 v i v_i v i 是 G G G 中的任意一个顶点。我们可以将 v i v_i v i 顶点从 G G G 中删去,得到 G 1 G_1 G 1 ,则 G 1 G_1 G 1 的阶数为 p p p 。G 1 G_1 G 1 是 G G G 的子图,所以 G 1 G_1 G 1 的最大度不可能超过 G G G 的最大度。由假设我们应该有
γ ( G 1 ) ≤ Δ ( G 1 ) + 1 ≤ Δ ( G ) + 1 \gamma (G_1)\quad \le \quad\Delta (G_1) + 1 \quad \le \quad\Delta (G) + 1
γ ( G 1 ) ≤ Δ ( G 1 ) + 1 ≤ Δ ( G ) + 1
当将 G 1 G_1 G 1 还原成 G G G 时,由于 v v v 至多与 G 1 G_1 G 1 中 Δ ( G ) \Delta (G) Δ ( G ) 个顶点相邻, 而在 G 1 G_1 G 1 的点着色中,Δ ( G ) \Delta (G) Δ ( G ) 个顶点至多用了 Δ ( G ) \Delta (G) Δ ( G ) 种颜色,于是在 Δ ( G ) + 1 \Delta (G) + 1 Δ ( G ) + 1 种颜色中至少存在一种颜色给 v v v 着色,使 v v v 与相邻的顶点着不同的颜色
Proof:
We use induction on the number of vertices in the graph, which we denote by n n n . Let P ( n ) P(n) P ( n ) be the proposition that an n-vertex
graph with maximum degree Δ ( G ) \Delta(G) Δ ( G ) at most k k k is ( k + 1 ) (k + 1) ( k + 1 ) -colorable.
Base case (n = 1):
A 1-vertex
graph has maximum degree 0 0 0 and is 1-colorable
, so P ( 1 ) P (1) P ( 1 ) is true.
Inductive step:
Now assume that P ( n ) P (n) P ( n ) is true, and let G G G be an (n + 1)-vertex
graph with maximum degree Δ ( G ) \Delta(G) Δ ( G ) at most k k k .
Remove a vertex v v v (and all edges incident to it), leaving an n-vertex
subgraph, H H H . The maximum degree of H H H , Δ H \Delta H Δ H is at most k k k , and so H H H is (k + 1)-colorable
by our assumption P ( n ) P (n) P ( n ) .
Now add back vertex v v v . We can assign v v v a color (from the set of k + 1 k + 1 k + 1 colors) that is different from all its adjacent vertices , since there are at most k k k vertices adjacent to v v v and so at least one of the k + 1 k + 1 k + 1 colors is still available.
Therefore, G G G is (k + 1)-colorable
. This completes the inductive step, and the theorem follows by induction .
上界 (2): 上界 (1) 的收紧
【Brooks定理】
设连通图即不是完全图 K n ( n ≥ 3 ) K_n(n \ge 3) K n ( n ≥ 3 ) ,也不是长度为奇数的环,则
γ ( G ) ≤ Δ ( G ) \gamma (G) \le \Delta (G)
γ ( G ) ≤ Δ ( G )
上界 (3)
γ ( G ) ≤ n + 1 − α ( G ) \gamma (G) \le n + 1 - \alpha(G)
γ ( G ) ≤ n + 1 − α ( G )
图的边着色
在一个图 G G G 中,任意相邻的两个边不能着相同的颜色 (即与同一个顶点链接的边不能着相同的颜色)。我们用 γ ( G ) \gamma (G) γ ( G ) 表示颜色的个数。
如果一个图对边着色所需颜色 γ ′ ( G ) \gamma' (G) γ ′ ( G ) 的最小数量是 k k k ,则我们称该图是 k − 边 可 着 色 的 k-边可着色的 k − 边 可 着 色 的
【性质】(维津定理)设G是简单图,则
Δ ( G ) ≤ γ ′ ( G ) ≤ Δ ( G ) + 1 \Delta (G) \le \gamma'(G) \le \Delta (G) +1
Δ ( G ) ≤ γ ′ ( G ) ≤ Δ ( G ) + 1
图的面着色
连通的无桥 平面图的平面嵌入及其所有的面称为平面地图 或地图 ,平面地图的面称为国家 。若两个国家的边界至少有一条公共边,则称这两个国家是相邻 的。
在一个平面地图 G G G 中,任意相邻的两个面不能着相同的颜色 。我们用 γ ∗ ( G ) \gamma^* (G) γ ∗ ( G ) 表示颜色的个数。
如果一个地图所需颜色 γ ∗ ( G ) \gamma^* (G) γ ∗ ( G ) 的最小数量是 k k k ,则我们称该图是 k − 面 可 着 色 的 k-面可着色的 k − 面 可 着 色 的
【定理】地图 G G G 是 k − 面 可 着 色 的 k-面可着色的 k − 面 可 着 色 的 当且仅当 他的对偶图 G ∗ G^* G ∗ 是 k − 点 可 着 色 的 k-点可着色的 k − 点 可 着 色 的
【五色定理】任何一个平面图都是 5 − 面 可 着 色 的 5-面可着色的 5 − 面 可 着 色 的
证明:
第六部分:网络流问题
回顾第二部分的连通部分
网络流
在生活中,经常会遇到一类问题:我们有一个如上图所示的抽象的供水管网,有起点和终点,我们需要求解关于这个供水管网的一系列性能问题。那么我们可以将其网络模型视为一种有向图 D D D ,而网络上的流可视为边上的权,所以我们可以将该问题建模为
D = ( V , E , ω ) D=(V,E,\omega)
D = ( V , E , ω )
其中:
s , t ∈ V s,t \in V s , t ∈ V ,s s s 为原点 (source),t t t 为目的点 (target)
ω \omega ω 为 A → R A \to R A → R 的映射。任何一条边 x ∈ A x \in A x ∈ A ,ω ( x ) \omega (x) ω ( x ) 为边 x x x 的容量 (Capacity)
【名词解释】
流量 (Flow):实际 在模型中管线里的流量 ,流量不能超过容量
容量 (Capacity):模型中边的权重,为该条边 所能够承受的最大流量
残差 (Residual):又称空闲量,指“该条边在当前流量下还可以继续承受的流量”,即 R e s i d u a l = C a p a c i t y − F l o w R_{esidual} = C_{apacity} - F_{low} R e s i d u a l = C a p a c i t y − F l o w
最大流 (Maximum Flow):在当前模型中能流过的最大总流量
最小割
最大流问题
简单算法
我们根据原图 (左) 创建一个残差图 (右),其中空闲量 R e s i d u a l = C a p a c i t y − F l o w R_{esidual} = C_{apacity} - F_{low} R e s i d u a l = C a p a c i t y − F l o w ,初始时 F l o w F_{low} F l o w 均为 0 0 0 ;
【第一轮循环】
节点
v 1 v_1 v 1
v 2 v_2 v 2
v 4 v_4 v 4
t
[前序,方向,权重]
[s,+,4]
[S,+,2]
[v 2 v_2 v 2 ,+,2]
[v 4 v_4 v 4 ,+,3]
我们在残差图中找出一条从起点 s s s 到终点 t t t 的简单路径,其中不能有回路。例如,我们已经找到了一条最右边的路径 $s \stackrel{2}\longrightarrow v_2 \stackrel{2}\longrightarrow v_4 \stackrel{3}\longrightarrow t $ 。由于短板效应,该条路径最多只能输送 2 2 2 ,所以三条边的路径的残差量都会 − 2 -2 − 2 ,即 $s \stackrel{0}\longrightarrow v_2 \stackrel{0}\longrightarrow v_4 \stackrel{1}\longrightarrow t $。
当某一条边的饱和 (Staturated) 即残差量为 0 0 0 时,就将其从残差图中移除 。第一轮循环结束。
【第二轮循环】
节点
v 1 v_1 v 1
v 4 v_4 v 4
v 3 v_3 v 3
t
[前序,方向,权重]
[s,+,4]
[v 1 v_1 v 1 ,+,4]
[v 1 v_1 v 1 ,+,2]
[v 3 v_3 v 3 ,+,3]
如下图所示,我们找到了一条从起点 s s s 到终点 t t t 的简单路径:$s \stackrel{4}\longrightarrow v_1 \stackrel{2}\longrightarrow v_3 \stackrel{3}\longrightarrow t $ ,
由于短板效应,该条路径最多只能输送 2 2 2 ,所以三条边的路径的残差量都会 − 2 -2 − 2 ,即 $s \stackrel{2}\longrightarrow v_1 \stackrel{0}\longrightarrow v_3 \stackrel{1}\longrightarrow t $。更新残差图。第二轮循环结束。
【第三次循环】
节点
v 1 v_1 v 1
v 4 v_4 v 4
t
[前序,方向,权重]
[s,+,2]
[v 1 v_1 v 1 ,+,4]
[v 4 v_4 v 4 ,+,1]
如下图所示,我们找到了一条从起点 s s s 到终点 t t t 的简单路径:$s \stackrel{2}\longrightarrow v_1 \stackrel{4}\longrightarrow v_4 \stackrel{1}\longrightarrow t $ ,
由于短板效应,该条路径最多只能输送 1 1 1 ,所以三条边的路径的残差量都会 − 1 -1 − 1 ,即 $s \stackrel{1}\longrightarrow v_1 \stackrel{3}\longrightarrow v_4 \stackrel{0}\longrightarrow t $。更新残差图。第三轮循环结束。
【第四次循环】
节点
v 1 v_1 v 1
v 2 v_2 v 2
v 4 v_4 v 4
t
[前序,方向,权重]
[s,+,1]
[v 1 v_1 v 1 ,+,1]
[v 1 v_1 v 1 ,+,3]
[v 3 v_3 v 3 ,+,1]
如下图所示,我们无法找到 一条从起点 s s s 到终点 t t t 的简单路径,终止程序。
用最后一次循环结果更新的残差 (Residual) 图与原图 (Capacity) 比较,得出流量 (Flow) 图,即 F l o w = C a p a c i t y − R e s i d u a l F_{low} = C_{apacity} - R_{esidual} F l o w = C a p a c i t y − R e s i d u a l ,如下图所示。
其中,边上的权重为 [ F l o w / C a p a c i t y ] [F_{low}/C_{apacity}] [ F l o w / C a p a c i t y ] ,我们也可以从图中看出,网络中的总流量 (Amount of Flow) = 2 + 3 = 5 = 2+3 = 5 = 2 + 3 = 5
Ford-Fulkerson 算法
Ford-Fulkerson 算法一定能找到最大流,其与之前的简单算法的区别是:添加了一个回溯路径 ,一旦选择了“不好的”路径,就会撤销这个路径,沿着回溯路径回到源点。
【算法描述】
我们根据原图 (左) 创建一个残差图 (右),其中空闲量 R e s i d u a l = C a p a c i t y − F l o w R_{esidual} = C_{apacity} - F_{low} R e s i d u a l = C a p a c i t y − F l o w ,初始时 F l o w F_{low} F l o w 均为 0 0 0 ;
【第一轮循环】
节点
v 1 v_1 v 1
v 2 v_2 v 2
v 4 v_4 v 4
t
[前序,方向,权重]
[s,+,4]
[S,+,2]
[v 1 v_1 v 1 ,+,4]
[v 4 v_4 v 4 ,+,3]
backtracking path (next)
[S,-,0]
[S,-,0]
[v 1 v_1 v 1 ,-,0]
[v 4 v_4 v 4 ,-,0]
我们在残差图中找出一条从起点 s s s 到终点 t t t 的简单路径,其中不能有回路。例如,我们已经找到了一条路径 $s \stackrel{4}\longrightarrow v_1 \stackrel{4}\longrightarrow v_4 \stackrel{3}\longrightarrow t $ 。由于短板效应,该条路径最多只能输送 3 3 3 ,所以三条边的路径的残差量都会 − 3 -3 − 3 ,即 $s \stackrel{1}\longrightarrow v_1 \stackrel{1}\longrightarrow v_4 \stackrel{0}\longrightarrow t $。更新残差图。
如上图所示,添加一条绿色的回溯路径 ,每个边的权都为 3 3 3 : t ⟶ 3 v 4 ⟶ 3 v 1 ⟶ 3 s t \stackrel{3}\longrightarrow v_4\stackrel{3}\longrightarrow v_1 \stackrel{3}\longrightarrow s t ⟶ 3 v 4 ⟶ 3 v 1 ⟶ 3 s 。第一轮循环结束。
【第二轮循环】
节点
v 1 v_1 v 1
v 2 v_2 v 2
v 3 v_3 v 3
t
[前序,方向,权重]
[S,+,1]
[S,+,2]
[v 1 v_1 v 1 ,+,2]
[v 3 v_3 v 3 ,+,3]
backtracking path
[S,-,3]
[S,-,0]
[v 1 v_1 v 1 ,-,0]
[v 3 v_3 v 3 ,-,0]
如下图所示,我们找到了一条从起点 s s s 到终点 t t t 的简单路径:$s \stackrel{1}\longrightarrow v_1 \stackrel{2}\longrightarrow v_3 \stackrel{3}\longrightarrow t $ ,
由于短板效应,该条路径最多只能输送 1 1 1 ,所以三条边的路径的残差量都会 − 1 -1 − 1 ,即 $s \stackrel{0}\longrightarrow v_1 \stackrel{1}\longrightarrow v_3 \stackrel{2}\longrightarrow t $。更新残差图。
如上图所示,添加一条绿色的回溯路径 ,每个边的权都为 1 1 1 : t ⟶ 1 v 3 ⟶ 1 v 1 ⟶ 1 s t \stackrel{1}\longrightarrow v_3\stackrel{1}\longrightarrow v_1 \stackrel{1}\longrightarrow s t ⟶ 1 v 3 ⟶ 1 v 1 ⟶ 1 s ,并于之前的回溯路径合并。第二轮循环结束。
【第三轮循环】
节点
v 1 v_1 v 1
v 2 v_2 v 2
v 4 v_4 v 4
v 3 v_3 v 3
t
[前序,方向,权重]
[S,+,0]
[S,+,2]
[v 2 v_2 v 2 ,+,2] / [v 1 v_1 v 1 ,+,1]
[v 1 v_1 v 1 ,+,1]
[v 3 v_3 v 3 ,+,2]
backtracking path
[S,-,4]
[S,-,0]
[v 2 v_2 v 2 ,-,0] / [v 1 v_1 v 1 ,-,1]
[v 1 v_1 v 1 ,-,1]
[v 3 v_3 v 3 ,-,1]
如果此时我们将绿色的回溯路径去掉,我们就不能在起点和终点之间找到一条路径。Ford-Fulkerson 算法的关键就在于这些回溯路径。如下图所示,我们考虑回溯路径,我们找到了一条从起点 s s s 到终点 t t t 的简单路径:s ⟶ 2 v 2 ⟶ 2 v 4 ⟶ 3 ∗ v 1 ⟶ 1 v 3 ⟶ 2 t s \stackrel{2}\longrightarrow v_2 \stackrel{2}\longrightarrow v_4 \stackrel{3^*}\longrightarrow v_1 \stackrel{1}\longrightarrow v_3 \stackrel{2}\longrightarrow t s ⟶ 2 v 2 ⟶ 2 v 4 ⟶ 3 ∗ v 1 ⟶ 1 v 3 ⟶ 2 t ,
由于短板效应,该条路径最多只能输送 1 1 1 ,所以三条边的路径的残差量都会 − 1 -1 − 1 ,即 s ⟶ 1 v 2 ⟶ 1 v 4 ⟶ 2 ∗ v 1 ⟶ 0 v 3 ⟶ 1 t s \stackrel{1}\longrightarrow v_2 \stackrel{1}\longrightarrow v_4 \stackrel{2^*}\longrightarrow v_1 \stackrel{0}\longrightarrow v_3 \stackrel{1}\longrightarrow t s ⟶ 1 v 2 ⟶ 1 v 4 ⟶ 2 ∗ v 1 ⟶ 0 v 3 ⟶ 1 t 。更新残差图。
如上图所示,添加一条绿色的回溯路径 ,每个边的权都为 1 1 1 : t ⟶ 1 v 3 ⟶ 1 v 1 ⟶ 1 ∗ v 4 ⟶ 1 v 2 ⟶ 1 s t \stackrel{1}\longrightarrow v_3 \stackrel{1}\longrightarrow v_1 \stackrel{1^*}\longrightarrow v_4 \stackrel{1}\longrightarrow v_2 \stackrel{1}\longrightarrow s t ⟶ 1 v 3 ⟶ 1 v 1 ⟶ 1 ∗ v 4 ⟶ 1 v 2 ⟶ 1 s ,并于之前的回溯路径合并。第三轮循环结束。
【第四轮循环】
如第三轮循环末的图所示,没有任何路径通往红色区域 v 3 ⟶ 1 t v_3 \stackrel{1}\longrightarrow t v 3 ⟶ 1 t ,说明现在不存在其他路径从起点流向终点,所以终止程序。
用最后一次循环结果更新的残差 (Residual) 图去除所有回溯路径 与原图 (Capacity) 比较,得出流量 (Flow) 图,即 F l o w = C a p a c i t y − R e s i d u a l F_{low} = C_{apacity} - R_{esidual} F l o w = C a p a c i t y − R e s i d u a l ,如下图所示。
其中,边上的权重为 [ F l o w / C a p a c i t y ] [F_{low}/C_{apacity}] [ F l o w / C a p a c i t y ] ,我们也可以从图中看出,网络中的总流量 (Amount of Flow) = 2 + 3 = 5 = 2+3 = 5 = 2 + 3 = 5 ,最大流的大小也等于 5 5 5 。
最小割问题
我们先回顾一下之前之前学习的割,可类比与今天的网络流中最小割问题。
在如上图所示的网络流中,有向图 D = ( V , E , ω ) D=(V,E,\omega) D = ( V , E , ω )
其中:
s , t ∈ V s,t \in V s , t ∈ V ,s s s 为原点 (source),t t t 为目的点 (target)
ω \omega ω 为 A → R A \to R A → R 的映射。任何一条边 x ∈ A x \in A x ∈ A ,ω ( x ) \omega (x) ω ( x ) 为边 x x x 的容量 (Capacity)
【定义】S-T Cut:将所有的顶点分为两个集合 S S S 和 T T T
S ∪ P = V S \cup P = V S ∪ P = V 并且 S ∩ P = ∅ S \cap P = \emptyset S ∩ P = ∅
s ∈ S s \in S s ∈ S 并且 t ∈ T t \in T t ∈ T
二元组集合 ( S , T ) (S,T) ( S , T ) 被称作 “S-T Cut”
如上图所示,我们去除图中红色的边,使得不存在任意一套路径可以从起点 s s s 到终点 t t t 。去除这些边后,定点集 V V V 就会分裂成两部分 S u b s e t S _{Subset}S S u b s e t S 和 S u b s e t T _{Subset}T S u b s e t T 。然而这样的集合划分并不唯一 。
【注意⚠️】图中有一条边 v 4 ⟶ 4 s v_4 \stackrel{4}\longrightarrow s v 4 ⟶ 4 s 连通 S u b s e t S _{Subset}S S u b s e t S 和 S u b s e t T _{Subset}T S u b s e t T ,但是即使有这条边的存在,依然不存在任意一套路径可以从起点 s s s 到终点 t t t 。所以我们不用去管他。
容量 C a p a c i t y ( S , T ) Capacity(S,T) C a p a c i t y ( S , T ) 是所有从集合 S u b s e t S _{Subset}S S u b s e t S 通向集合 S u b s e t T _{Subset}T S u b s e t T 的边的权重之和 ,
上图中左边的容量 C a p a c i t y 左 ( S , T ) = 2 + 1 = 3 Capacity_左(S,T) = 2+1 =3 C a p a c i t y 左 ( S , T ) = 2 + 1 = 3 ,
右边的“S-T Cut”容量 C a p a c i t y 右 ( S , T ) = 2 + 2 + 2 = 6 Capacity_右(S,T) = 2+2+2 = 6 C a p a c i t y 右 ( S , T ) = 2 + 2 + 2 = 6
【最小割】:Minimum S-T Cut (Min-Cut),是在所有“S-T Cut” 中容量最小的那个。目标是用最小的“力气”(权)就可以截断水流(起点 s s s 不到终点 t t t )。
最大流 - 最小割问题
对于一个网络流问题,最大流的流量 就等于 最小割的容量 ,即
M a x f l o w = M i n c u t Max \;flow = Min\;cut
M a x f l o w = M i n c u t
我们可以将 寻找最小割的问题 等价转化为 寻找最大流问题 :
在 寻找最大流问题 中,在最后一次迭代中去除回溯路径 的残差图 (Residual Graph) 中,从起点 s s s 出发,找到所有能达到的节点,将它们放入集合 S u b s e t S _{Subset}S S u b s e t S ,将剩下的所有节点放入集合 S u b s e t T _{Subset}T S u b s e t T 。这样就得到了最小割的二元组 ( S , T ) (S,T) ( S , T ) 。