【离散数学】图论 第七章(3) 图的矩阵表示(邻接矩阵、可达矩阵、传递闭包求解算法)

本文属于「离散数学」系列文章之一。这一系列着重于离散数学的学习和应用。由于内容随时可能发生更新变动,欢迎关注和收藏离散数学系列文章汇总目录一文以作备忘。此外,在本系列学习文章中,为了透彻理解数学知识,本人参考了诸多博客、教程、文档、书籍等资料。以下是本文的不完全参考目录,在后续学习中还会逐渐补充:

  • 国外经典教材)离散数学及其应用 第八版 Discrete Mathematics and Its Applications Eighth Edition ,作者是 Kenneth H.Rosen ,袁崇义译,机械工业出版社
  • 离散数学 第二版,武波等编著,西安电子科技大学出版社,2006年
  • 离散数学 第三版,方世昌等编著,西安电子科技大学出版社,2013年
  • (经典参考书及其题解)离散数学/离散数学——理论•分析•题解,左孝凌、李为鉴、刘永才编著,上海科学技术文献出版社
  • 离散数学习题集:数理逻辑与集合论分册,耿素云;图论分册,耿素云;抽象代数分册, 张立昂。北京大学出版社


7.3 图的矩阵表示

采用矩阵表示图,便于计算机存储和处理图的信息(只对小图、稠密图有点用),也便于运用代数的方法研究图的性质(这才是重点!),例如,我们可以通过矩阵计算结果,判定图的连通性/可达性等问题。

7.3.1 邻接矩阵

定义7.3.1 G = ⟨ V , E ⟩ G= \langle V, E\rangle G=V,E 是一个线图,结点集合 V = { v 1 , v 2 , … , v n } V = \{ v_1, v_2, \dots, v_n\} V={v1,v2,,vn} ,令 A ( G ) = [ a i j ] n × n A(G) = [a_{ij}]_{n\times n} A(G)=[aij]n×n ,其中:
a i j = { 1 若 [ v i ,   v j ] ∈ E 0 若 [ v i ,   v j ] ∉ E a_{ij} = \begin{cases} 1 \quad &若[v_i,\ v_j] \in E\\ 0\quad &若[v_i,\ v_j] \notin E \end{cases} aij={10[vi, vj]E[vi, vj]/E 则称 A ( G ) A(G) A(G) G G G邻接矩阵 adjacency matrix

【例1】设 G 1 G_1 G1 是有向图、 G 2 G_2 G2 是无向图,分别如图7.3.1(a)和(b)所示,写出 G 1 , G 2 G_1, G_2 G1,G2 的邻接矩阵。

解:
A ( G 1 ) = [ 1 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 ]   A ( G 2 ) = [ 1 1 1 1 1 0 1 0 1 1 0 1 1 0 1 1 ] A(G_1)= \begin{bmatrix} 1 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0\\ 1 & 1 & 0 & 0 \\ 0 & 0 & 1 & 1 \end{bmatrix} \ A(G_2)= \begin{bmatrix} 1 & 1 & 1 & 1 \\ 1 & 0 & 1 & 0\\ 1 & 1 & 0 & 1 \\ 1 & 0 & 1 & 1 \end{bmatrix} A(G1)=1010101001010001 A(G2)=1111101011011011

当结点编号次序不同时,同一个图所得的邻接矩阵可能不同,但可以通过有限次的行、列变换而得到相同的邻接矩阵(同构的图?)。

通过图的邻接矩阵运算,可以判断图的一些性质。设 G = ⟨ V , E ⟩ G = \langle V, E\rangle G=V,E有向线图 ∣ V ∣ = n |V| = n V=n A A A G G G 的邻接矩阵。

1. A A T AA^T AAT 的元素的意义

可知, b i j = ∑ k = 1 n a i k ⋅ a j k b_{ij} = \displaystyle \sum^n_{k = 1} a_{ik} \cdot a_{jk} bij=k=1naikajk ,如图7.3.2所示,则在 G G G 中恰好有 b i j b_{ij} bij 个结点,从 v i v_i vi v j v_j vj 均有边引出到这些结点 v k 1 , v k 2 , … , v k n v_{k_1}, v_{k_2}, \dots, v_{k_n} vk1,vk2,,vkn 。特别地, i = j i = j i=j b i j b_{ij} bij 表示 v i v_i vi 的出度

2. A T A A^TA ATA 的元素的意义

可知, b i j = ∑ k = 1 n a k i ⋅ a k j b_{ij} = \displaystyle \sum^n_{k = 1} a_{ki} \cdot a_{kj} bij=k=1nakiakj ,如图7.3.3所示,则在 G G G 中恰好有 b i j b_{ij} bij 个结点,以这些结点为始点,既有边引入到 v i v_i vi又有边引入到 v j v_j vj 。特别地, i = j i = j i=j b i j b_{ij} bij 表示 v i v_i vi 的入度

3. A 2 = A × A A^{2} = A\times A A2=A×A 的元素的意义

若有 b i j = ∑ k = 1 n a i k ⋅ a k j b_{ij} = \displaystyle \sum^n_{k = 1} a_{ik} \cdot a_{kj} bij=k=1naikakj ,如图7.3.4所示,则从 v i v_i vi v j v_j vj 长度为 2 2 2 的路有 b i j b_{ij} bij 条。特别地,当 i = j i = j i=j v i v_i vi 到自身长度为 2 2 2 的回路有 b i j b_{ij} bij 条。

对于 A m = A × A × ⋯ × A ⏟ m 个 A ,   m ≥ 1 A^m =\underbrace{ A\times A\times \dots \times A}_{m个A},\ m \ge 1 Am=mA A×A××A, m1 ,有如下结论。
定理7.3.1 G = ⟨ V , E ⟩ G = \langle V, E\rangle G=V,E有向线图,结点集 V = { v 1 , v 2 , … , v n } V = \{ v_1, v_2, \dots, v_n\} V={v1,v2,,vn} A = [ a i j ] n × n A = [a_{ij}]_{n\times n} A=[aij]n×n G G G 的邻接矩阵, A m = [ a i j ( m ) ] n × n A^m = [a_{ij}^{(m)}]_{n\times n} Am=[aij(m)]n×n ,则 G G G 中从 v i v_i vi v j v_j vj a i j ( m ) a_{ij}^{(m)} aij(m) 条长度为 m m m 的路。
证明 m m m 进行归纳。

  • m = 1 , m = 2 m = 1, m = 2 m=1,m=2 时,由定义和上面的分析可知,显然成立;
  • 设当 m = t   ( t ≥ 2 ) m = t\ (t \ge 2) m=t (t2) 时,命题成立;
  • m = t + 1 m = t + 1 m=t+1 时,由
    A t + 1 = A ⋅ A t = [ a i j ( t + 1 ) ] n × n = [   ∑ k = 1 n a i k ⋅ a k j ( t )   ] A^{t + 1} = A \cdot A^t = [a_{ij}^{(t + 1)}]_{n\times n} =\bigg [\ \sum^n_{k = 1} a_{ik} \cdot a_{kj}^{(t)}\ \bigg] At+1=AAt=[aij(t+1)]n×n=[ k=1naikakj(t) ] a i j ( t + 1 ) = ∑ k = 1 n a i k ⋅ a k j ( t ) \displaystyle a_{ij}^{(t + 1)} = \sum^n_{k = 1} a_{ik} \cdot a_{kj}^{(t)} aij(t+1)=k=1naikakj(t) 。根据邻接矩阵的定义可知, a i k a_{ik} aik 表示结点 v i v_i vi v k v_k vk 的长度为 1 1 1 的路的条数。根据归纳假设知, a k j ( t ) a_{kj}^{(t)} akj(t) 是连接 v k v_k vk v j v_j vj 的长度为 t t t 的路的条数。因此, a i k ⋅ a k j ( t ) a_{ik} \cdot a_{kj}^{(t)} aikakj(t) 表示从结点 v i v_i vi 出发、经过 v k v_k vk 、到达结点 v j v_j vj 的长度为 t + 1 t+1 t+1 的路的条数。
    对所有的 k ∈ { 1 , 2 , … , n } k \in \{ 1, 2, \dots, n\} k{1,2,,n} 求和得 a i j ( t + 1 ) = ∑ k = 1 n a i k ⋅ a k j ( t ) a_{ij}^{(t + 1)} = \displaystyle \sum_{k = 1}^n a_{ik} \cdot a_{kj}^{(t)} aij(t+1)=k=1naikakj(t) a i j ( t + 1 ) a_{ij}^{(t + 1)} aij(t+1) 就是从结点 v i v_i vi 到结点 v j v_j vj 的、所有长度为 t + 1 t + 1 t+1 的路的条数。故当 k = t + 1 k = t + 1 k=t+1 时命题也成立。

以上仅给出有向线图的一些基本结论,对于无向线图也有类似结论。

【例2】有向图 G = ⟨ V , E ⟩ G = \langle V, E\rangle G=V,E 如图7.3.5所示,用 G G G 的邻接矩阵计算从顶点 v 3 v_3 v3 v 1 v_1 v1 的所有有向通路 path

解:图 G G G 的邻接矩阵为:
A = [ 0 1 0 0 0 0 1 1 0 1 0 1 1 1 0 0 ] A =\begin{bmatrix} 0 & 1 & 0 & 0\\ 0 & 0 & 1 & 1 \\ 0 & 1 & 0 & 1 \\ 1 & 1 & 0 & 0 \end{bmatrix} A=0001101101000110 A [ 3 ] [ 1 ] = 0 A[3][1] = 0 A[3][1]=0 知(下标从1开始),从顶点 v 3 v_3 v3 v 1 v_1 v1 没有长度为 1 1 1 的通路。再计算 A 2 A^2 A2
A 2 = [ 0 0 1 1 1 2 0 1 1 1 1 1 0 1 1 1 ] A^2 =\begin{bmatrix} 0 & 0 & 1 & 1\\ 1 & 2 & 0 & 1 \\ 1 & 1 & 1 & 1 \\ 0 & 1 & 1 & 1 \end{bmatrix} A2=0110021110111111 A 2 [ 3 ] [ 1 ] = 1 A^2 [3][1] = 1 A2[3][1]=1 可知,从顶点 v 3 v_3 v3 v 1 v_1 v1 的、长度为 2 2 2 的路有 1 1 1 条。根据计算过程:
A 2 [ 3 ] [ 1 ] = A [ 3 ] [ 1 ] × A [ 1 ] [ 1 ] + A [ 3 ] [ 2 ] × A [ 2 ] [ 1 ] + A [ 3 ] [ 3 ] × A [ 3 ] [ 1 ] + A [ 3 ] [ 4 ] × A [ 4 ] [ 1 ] = 0 × 0 + 1 × 0 + 0 × 0 + 1 × 1 = 1 \begin{aligned} A^2[3][1] &= A[3][1] \times A[1][1] + A[3][2] \times A[2][1] \\ &+ A[3][3] \times A[3][1] + A[3][4] \times A[4][1] \\ &= 0 \times 0 + 1 \times 0 + 0\times 0 + 1 \times 1 = 1 \end{aligned} A2[3][1]=A[3][1]×A[1][1]+A[3][2]×A[2][1]+A[3][3]×A[3][1]+A[3][4]×A[4][1]=0×0+1×0+0×0+1×1=1 得到从顶点 v 3 v_3 v3 v 1 v_1 v1 的、长度为 2 2 2 的有向路为 ( v 3 ,   v 4 ,   v 1 ) (v_3,\ v_4,\ v_1) (v3, v4, v1) 。显然,它也是一条通路。再计算 A 3 A^3 A3
A 3 = [ 1 2 0 1 1 2 2 2 1 3 1 2 1 2 1 2 ] A^3 =\begin{bmatrix} 1 & 2 & 0 & 1\\ 1 & 2 & 2 & 2 \\ 1 & 3 & 1 & 2 \\ 1 & 2 & 1 & 2 \end{bmatrix} A3=1111223202111222 A 3 [ 3 ] [ 1 ] = 1 A^3[3][1] = 1 A3[3][1]=1 知,从顶点 v 3 v_3 v3 v 1 v_1 v1 的、长度为 3 3 3 的路有 1 1 1 条。根据计算过程:
A 3 [ 3 ] [ 1 ] = A 2 [ 3 ] [ 1 ] × A [ 1 ] [ 1 ] + A 2 [ 3 ] [ 2 ] × A [ 2 ] [ 1 ] + A 2 [ 3 ] [ 3 ] × A [ 3 ] [ 1 ] + A 2 [ 3 ] [ 4 ] × A [ 4 ] [ 1 ] = 1 × 0 + 1 × 0 + 1 × 0 + 1 × 1 = 1 \begin{aligned} A^3[3][1] &= A^2[3][1] \times A[1][1] + A^2[3][2] \times A[2][1] \\ &+ A^2[3][3] \times A[3][1] + A^2[3][4] \times A[4][1] \\ &= 1 \times 0 + 1 \times 0 + 1\times 0 + 1 \times 1 = 1 \end{aligned} A3[3][1]=A2[3][1]×A[1][1]+A2[3][2]×A[2][1]+A2[3][3]×A[3][1]+A2[3][4]×A[4][1]=1×0+1×0+1×0+1×1=1 得到从顶点 v 3 v_3 v3 v 1 v_1 v1 的、长度为 3 3 3 的有向路为:从顶点 v 3 v_3 v3 v 4 v_4 v4 的一条长度为 2 2 2 的路接上 ( v 4 ,   v 1 ) (v_4,\ v_1) (v4, v1) 。再根据计算过程:
A 2 [ 3 ] [ 4 ] = A [ 3 ] [ 1 ] × A [ 1 ] [ 4 ] + A [ 3 ] [ 2 ] × A [ 2 ] [ 4 ] + A [ 3 ] [ 3 ] × A [ 3 ] [ 4 ] + A [ 3 ] [ 4 ] × A [ 4 ] [ 4 ] = 0 × 0 + 1 × 1 + 0 × 1 + 1 × 0 = 1 \begin{aligned} A^2[3][4] &= A[3][1] \times A[1][4] + A[3][2] \times A[2][4] \\ &+ A[3][3] \times A[3][4] + A[3][4] \times A[4][4] \\ &= 0 \times 0 + 1 \times 1 + 0\times 1 + 1 \times 0 = 1 \end{aligned} A2[3][4]=A[3][1]×A[1][4]+A[3][2]×A[2][4]+A[3][3]×A[3][4]+A[3][4]×A[4][4]=0×0+1×1+0×1+1×0=1 得到从顶点 v 3 v_3 v3 v 4 v_4 v4 的一条长度为 2 2 2 的有向路是 ( v 3 ,   v 2 ,   v 4 ) (v_3,\ v_2,\ v_4) (v3, v2, v4) 。所以,从顶点 v 3 v_3 v3 v 1 v_1 v1 的、长度为 3 3 3 的有向路是 ( v 3 ,   v 2 ,   v 4 ,   v 1 ) (v_3,\ v_2,\ v_4, \ v_1) (v3, v2, v4, v1) 。显然,它也是一条通路。

因为对于 4 4 4 个结点的有向图,当路的长度超过 3 3 3 时,必定不是通路,所以从顶点 v 3 v_3 v3 v 1 v_1 v1 的通路共有两条: ( v 3 ,   v 4 ,   v 1 ) (v_3,\ v_4,\ v_1) (v3, v4, v1) ( v 3 ,   v 2 ,   v 4 ,   v 1 ) (v_3,\ v_2,\ v_4,\ v_1) (v3, v2, v4, v1)


7.3.2 可达矩阵

1. 可达矩阵定义

定义7.3.2 G = ⟨ V , E ⟩ G= \langle V, E\rangle G=V,E 是一个线图,结点集合 V = { v 1 , v 2 , … , v n } V = \{ v_1, v_2, \dots, v_n\} V={v1,v2,,vn} ,令 P ( G ) = [ p i j ] n × n P(G) = [p_{ij}]_{n\times n} P(G)=[pij]n×n ,其中:
p i j = { 1 若 从   v i   可 达   v j   0 若 从   v i   不 可 达   v j p_{ij} = \begin{cases} 1 \quad &若从\ v_i\ 可达\ v_j\ \\ 0\quad &若从\ v_i\ 不可达\ v_j \end{cases} pij={10 vi  vj  vi  vj 则称 P ( G ) P(G) P(G) G G G可达矩阵

可达矩阵用于描述一个线图中、从任一结点到另一结点之间是否存在路。由于在图中「两个结点之间有路」,则「必存在长度小于等于 n − 1 n - 1 n1 的通路」。另外,一般认为「同一个结点到自身可达」。因此,可用以下公式计算 P ( G ) P(G) P(G)
P ( G ) = [ p i j ] n × n = A 0 ∨ A 1 ∨ ⋯ ∨ A n − 1 P(G) = [p_{ij} ]_{n\times n} = A^0 \lor A^1 \lor \cdots \lor A^{n - 1} P(G)=[pij]n×n=A0A1An1 其中, A 0 A^0 A0 n × n n\times n n×n 的单位矩阵, ∨ \lor 是析取(或逻辑加/并)运算。即「顶点 v i v_i vi 到达 v j v_j vj 有长度为零的路、或有长度为 1 1 1 的路、……、或有长度为 n − 1 n - 1 n1 的路」,这些路可能是通路、可能不是,但其中至少存在一条通路

2. 可达矩阵求解连通性和强分图

为什么要在【图的连通性】后介绍【图的矩阵表示(邻接矩阵、可达矩阵)】,是因为利用邻接矩阵 A A A 和可达矩阵 P P P ,可判断图的连通性

  • 无向线图 G G G 是连通图,当且仅当它的可达矩阵 P P P 为全 1 1 1 矩阵;
  • 有向线图 G G G 是强连通图,当且仅当它的可达矩阵 P P P 为全 1 1 1 矩阵;
  • 有向线图 G G G 是单向连通图,当且仅当 P ∨ P T P \lor P^T PPT 为全 1 1 1 矩阵;
  • 有向线图 G G G 是弱连通图(忽略方向的底图为连通图),当且仅当以 P ∨ A T P\lor A^T PAT 作为邻接矩阵,求得的可达矩阵 P ′ P' P 为全 1 1 1 矩阵

利用可达矩阵 P P P ,还可求得有向图的强分图。设 G = ⟨ V , E ⟩ G = \langle V, E\rangle G=V,E P P P 为图 G G G 的可达矩阵。考察 P ∧ P T P \land P^T PPT ,对于任何 i ∈ { 1 , 2 , … , n } i\in \{ 1, 2, \dots, n\} i{1,2,,n} ,设第 i i i 行的非零元素所在的列分别是 i 1 , i 2 , … , i k i_1, i_2, \dots, i_k i1,i2,,ik 列( i i i 行必有第 i i i 列非零),则结点集 V i = { v i 1 , v i 2 , … , v i k } V_i = \{ v_{i_1}, v_{i_2}, \dots, v_{i_k}\} Vi={vi1,vi2,,vik} 导出的子图 G ( V i ) G(V_i) G(Vi) 是图 G G G 的一个强分图(一个 1 1 1 子矩阵;另知强连通是等价关系)。
【例3】 设有向线图 G = ⟨ V , E ⟩ G = \langle V, E\rangle G=V,E 如图7.3.6所示,求 G G G 的强分图。

解:首先求邻接矩阵 A A A 的幂次:
A 0 = [ 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 ] , A 1 = [ 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 ] , A 2 = [ 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 ] , A 3 = [ 0 0 1 0 1 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 0 1 0 ] , A 4 = A 2 = [ 0 0 0 1 0 0 0 1 0 1 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 ] A^0 = \begin{bmatrix} 1 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0 \\ 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 0 & 1 \end{bmatrix}, A^1 = \begin{bmatrix} 0 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 1 & 0 & 1\\ 0 & 0 & 0 & 1 & 0 \end{bmatrix}, \\ {} \\ A^2 = \begin{bmatrix} 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & 0 & 1\\ 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 1 & 0 & 1 \end{bmatrix}, A^3 = \begin{bmatrix} 0 & 0 & 1 & 0 & 1\\ 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 1 & 0 & 1\\ 0 & 0 & 0 & 1 & 0 \end{bmatrix}, \\ {} \\ A^4 = A^2 = \begin{bmatrix} 0 & 0 & 0 & 1 & 0 \\ 0 & 0 & 1 & 0 & 1 \\ 0 & 0 & 1 & 0 & 1\\ 0 & 0 & 0 & 1 & 0\\ 0 & 0 & 1 & 0 & 1 \end{bmatrix} A0=1000001000001000001000001,A1=0000000000100100110100010,A2=0000000000011011001001101,A3=0000000000100100110110010,A4=A2=0000000000011011001001101 可求得图 G G G 的可达矩阵:
P = A 0 ∨ A 1 ∨ A 2 ∨ A 3 = [ 1 0 1 1 1 0 1 1 1 1 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 ] , P T = [ 1 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ] , P ∧ P T = [ 1 0 0 0 0 0 1 0 0 0 0 0 1 1 1 0 0 1 1 1 0 0 1 1 1 ] P = A^0 \lor A^1 \lor A^2 \lor A^3 = \begin{bmatrix} 1 & 0 & 1 & 1 & 1\\ 0 & 1 & 1 & 1 & 1\\ 0 & 0 & 1 & 1 & 1\\ 0 & 0 & 1 & 1 & 1\\ 0 & 0 & 1 & 1 & 1 \end{bmatrix},\\ {} \\ P^T = \begin{bmatrix} 1 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0\\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 & 1 \end{bmatrix}, P\land P^T = \begin{bmatrix} 1 & 0 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 & 0\\ 0 & 0 & 1 & 1 & 1 \\ 0 & 0 & 1 & 1 & 1 \\ 0 & 0 & 1 & 1 & 1 \end{bmatrix} P=A0A1A2A3=1000001000111111111111111,PT=1011101111001110011100111,PPT=1000001000001110011100111 由此可知, G G G 的强分图有 3 3 3 个: { v 1 } ,   { v 2 } ,   { v 3 , v 4 , v 5 } \{ v_1 \},\ \{ v_2 \}, \ \{ v_3, v_4, v_5\} {v1}, {v2}, {v3,v4,v5}

【例4】设有向图 D = ⟨ V , E ⟩ D = \langle V, E\rangle D=V,E 如图7.3.7所示,请回答下列问题。

(1)图 D D D v 1 v_1 v1 v 3 v_3 v3 长度为 3 3 3 的通路有多少条?
(2)图 D D D 是哪种类型的连通图?
解:
(1) D D D 的邻接矩阵及其幂次为:
A 0 = [ 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 ] , A 1 = [ 0 1 1 1 1 0 1 0 0 0 0 1 0 0 0 0 ] , A 2 = [ 1 0 1 1 0 1 1 2 0 0 0 0 0 0 0 0 ] , A 3 = [ 0 1 1 2 1 0 1 1 0 0 0 0 0 0 0 0 ] A^0 = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix}, A^1 = \begin{bmatrix} 0 & 1 & 1 & 1\\ 1 & 0 & 1 & 0\\ 0 & 0 & 0 & 1\\ 0 & 0 & 0 & 0 \end{bmatrix}, \\ {} \\ A^2 = \begin{bmatrix} 1 & 0 & 1 & 1 \\ 0 & 1 & 1 & 2 \\ 0 & 0 & 0 & 0 \\ 0 & 0 & 0 & 0 \end{bmatrix}, A^3 = \begin{bmatrix} 0 & 1 & 1 & 2\\ 1 & 0 & 1 & 1\\ 0 & 0 & 0 & 0\\ 0 & 0 & 0 & 0 \end{bmatrix} A0=1000010000100001,A1=0100100011001010,A2=1000010011001200,A3=0100100011002100 A 3 [ 1 ] [ 4 ] = 2 A^3[1][4] = 2 A3[1][4]=2 知, v 1 v_1 v1 v 4 v_4 v4 共有两条长度为 3 3 3 的路,计算过程如下:
A 3 [ 1 ] [ 4 ] = A 2 [ 1 ] [ 1 ] × A [ 1 ] [ 4 ] + A 2 [ 1 ] [ 2 ] × A [ 2 ] [ 4 ] + A 2 [ 1 ] [ 3 ] × A [ 3 ] [ 4 ] + A 2 [ 1 ] [ 4 ] × A [ 4 ] [ 4 ] = 1 × 1 + 0 × 0 + 1 × 1 + 1 × 0 = 2 A 2 [ 1 ] [ 1 ] = A [ 1 ] [ 1 ] × A [ 1 ] [ 1 ] + A [ 1 ] [ 2 ] × A [ 2 ] [ 1 ] + A [ 1 ] [ 3 ] × A [ 3 ] [ 1 ] + A [ 1 ] [ 4 ] × A [ 4 ] [ 1 ] = 0 × 0 + 1 × 1 + 1 × 0 + 1 × 0 = 1 A 2 [ 1 ] [ 3 ] = A [ 1 ] [ 1 ] × A [ 1 ] [ 3 ] + A [ 1 ] [ 2 ] × A [ 2 ] [ 3 ] + A [ 1 ] [ 3 ] × A [ 3 ] [ 3 ] + A [ 1 ] [ 4 ] × A [ 4 ] [ 3 ] = 0 × 1 + 1 × 1 + 1 × 0 + 1 × 0 = 1 \begin{aligned} A^3[1][4] &= A^2[1][1] \times A[1][4] + A^2[1][2] \times A[2][4] \\ &+ A^2[1][3] \times A[3][4] + A^2[1][4] \times A[4][4] \\ &= 1 \times 1 + 0 \times 0 + 1 \times 1 + 1 \times 0 = 2 \end{aligned} \\ \begin{aligned} A^2[1][1] &= A[1][1] \times A[1][1] + A[1][2] \times A[2][1] \\ &+ A[1][3] \times A[3][1] + A[1][4] \times A[4][1] \\ &= 0 \times 0 + 1 \times 1 + 1 \times 0 + 1 \times 0 = 1 \end{aligned} \\ \begin{aligned} A^2[1][3] &= A[1][1] \times A[1][3] + A[1][2] \times A[2][3] \\ &+ A[1][3] \times A[3][3] + A[1][4] \times A[4][3] \\ &= 0 \times 1 + 1 \times 1 + 1 \times 0 + 1 \times 0 = 1 \end{aligned} A3[1][4]=A2[1][1]×A[1][4]+A2[1][2]×A[2][4]+A2[1][3]×A[3][4]+A2[1][4]×A[4][4]=1×1+0×0+1×1+1×0=2A2[1][1]=A[1][1]×A[1][1]+A[1][2]×A[2][1]+A[1][3]×A[3][1]+A[1][4]×A[4][1]=0×0+1×1+1×0+1×0=1A2[1][3]=A[1][1]×A[1][3]+A[1][2]×A[2][3]+A[1][3]×A[3][3]+A[1][4]×A[4][3]=0×1+1×1+1×0+1×0=1 即这两条长度为 3 3 3 的路为 ( v 1 ,   v 2 ,   v 1 ,   v 4 ) (v_1,\ v_2,\ v_1,\ v_4) (v1, v2, v1, v4) ( v 1 ,   v 2 ,   v 3 ,   v 4 ) (v_1,\ v_2,\ v_3,\ v_4) (v1, v2, v3, v4) 。其中, ( v 1 ,   v 2 ,   v 3 ,   v 4 ) (v_1,\ v_2,\ v_3,\ v_4) (v1, v2, v3, v4) 是一条通路,所以 D D D v 1 v_1 v1 v 4 v_4 v4 长度为 3 3 3 的通路有一条。
(2)计算 D D D 的可达矩阵。显然, D D D 不是强连通的,因为 v 3 v_3 v3 v 1 v_1 v1 是不可达的; D D D 是单侧连通的(即对于任意顶点偶对,至少一个结点到另一个结点是可达的),因为 P ∨ P T P \lor P^T PPT 是全 1 1 1 矩阵:
P = A 0 ∨ A 1 ∨ A 2 ∨ A 3 = [ 1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 ] , P T = [ 1 1 0 0 1 1 0 0 1 1 1 0 1 1 1 1 ] , P ∨ P T = [ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ] P = A^0 \lor A^1 \lor A^2 \lor A^3 = \begin{bmatrix} 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 \\ 0 & 0 & 1 & 1 \\ 0 & 0 & 0 & 1 \end{bmatrix},\\ {}\\ P^T = \begin{bmatrix} 1 & 1 & 0 & 0 \\ 1 & 1 & 0 & 0 \\ 1 & 1 & 1 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix}, P\lor P^T = \begin{bmatrix} 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 \end{bmatrix} P=A0A1A2A3=1100110011101111,PT=1111111100110001,PPT=1111111111111111


7.3.3 求解传递闭包的快速算法

在第3章中,曾使用关系图表示二元关系,而关系图就是有向图。本节将利用图的矩阵表示及其运算,讨论求解有限集合上「二元关系的传递闭包」的快速算法。

定理7.3.2 R R R 是集合 V V V 上的二元关系, n ∈ Z + n \in \Z^+ nZ+ ,对于任意 a , b ∈ V ,   ⟨ a , b ⟩ ∈ R n a, b\in V,\ \langle a, b \rangle \in R^n a,bV, a,bRn 当且仅当 R R R 的关系图 G = ⟨ V , E ⟩ G = \langle V, E\rangle G=V,E 中,存在从 a a a b b b 的长度为 n n n 的有向路。
证明 n n n 进行归纳:
(1)(归纳基础)根据关系图的定义,从 a a a b b b 存在一条长度为 1 1 1 的路,当且仅当 ⟨ a , b ⟩ ∈ R \langle a, b \rangle \in R a,bR 。故当 n = 1 n = 1 n=1 时命题成立。
(2)(归纳假设)假设当 n = k   ( k ≥ 1 ) n = k\ (k \ge 1) n=k (k1) 时,命题成立。
(3)(归纳推理)当 n = k + 1 n = k + 1 n=k+1 时, a a a b b b 存在一条长度为 k + 1 k + 1 k+1 的路,当且仅当存在元素 c ∈ V c \in V cV ,使得从 a a a c c c 存在一条长度为 k k k 的路、从 c c c b b b 存在一条长度为 1 1 1 的路,当且仅当存在元素 c ∈ V c \in V cV 且满足 ⟨ a , c ⟩ ∈ R k ,   ⟨ c , b ⟩ ∈ R \langle a, c\rangle \in R^k,\ \langle c, b \rangle \in R a,cRk, c,bR ,当且仅当 ⟨ a , b ⟩ ∈ R k ∘ R = R k + 1 \langle a, b \rangle \in R^k \circ R = R^{k + 1} a,bRkR=Rk+1
因此,从 a a a b b b 存在一条长度为 k + 1 k + 1 k+1 的路,当且仅当 ⟨ a , b ⟩ ∈ R k + 1 \langle a, b \rangle \in R^{k + 1} a,bRk+1

由邻接矩阵的定义可知,集合 V V V 上的二元关系 R R R 的关系矩阵,就是其关系图的邻接矩阵。

M R M_R MR n n n 元素集合 V V V 上的二元关系 R R R 的关系矩阵(即对应关系图的邻接矩阵), R R R 的传递闭包 t ( R ) = R ∪ R 2 ∪ ⋯ ∪ R n t(R) = R\cup R^2\cup \cdots \cup R^n t(R)=RR2Rn

  • t ( R ) t(R) t(R) 的关系矩阵 M t ( R ) = M R ∨ M R 2 ∨ ⋯ ∨ M R n M_{t(R)} = M_R \lor M_{R^2} \lor \cdots \lor M_{R^n} Mt(R)=MRMR2MRn
  • t ( R ) t(R) t(R) 的关系图是—— R R R 关系图中任意结点 a , b a, b a,b 间「有长度为 1 1 1 的路可达(即 ⟨ a , b ⟩ ∈ R \langle a, b \rangle \in R a,bR)、或有长度为 2 2 2 的路可达(即 ⟨ a , b ⟩ ∈ R 2 \langle a, b \rangle \in R^2 a,bR2)、……、或有长度为 n n n 的路可达(即 ⟨ a , b ⟩ ∈ R n \langle a, b \rangle \in R^n a,bRn)」这一二元关系的关系图。

【例5】已知集合 V = { a , b , c } V = \{ a, b, c\} V={a,b,c} ,集合 V V V 上二元关系 R R R 的关系图如图7.3.8(a)所示,求关系 R R R 的传递闭包 t ( R ) t(R) t(R) 的关系矩阵和关系图:

解: R R R 的关系矩阵 M R = [ 1 0 1 0 1 0 1 1 0 ] M_R = \begin{bmatrix} 1 & 0 & 1\\ 0 & 1 & 0 \\ 1 & 1 & 0 \end{bmatrix} MR=101011100 ,而 M t ( R ) = M R ∨ M R 2 ∨ M R 3 = [ 1 0 1 0 1 0 1 1 0 ] ∨ [ 1 1 1 0 1 0 1 1 1 ] ∨ [ 1 1 1 0 1 0 1 1 1 ] = [ 1 1 1 0 1 0 1 1 1 ] M_{t(R)} = M_R \lor M_{R^2} \lor M_{R^3} = \begin{bmatrix} 1 & 0 & 1\\ 0 & 1 & 0 \\ 1 & 1 & 0 \end{bmatrix} \lor \begin{bmatrix} 1 & 1 & 1 \\ 0 & 1 & 0 \\ 1 & 1 & 1 \end{bmatrix} \lor \begin{bmatrix} 1 & 1 & 1 \\ 0 & 1 & 0 \\ 1 & 1 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 1 & 1 \\ 0 & 1 & 0 \\ 1 & 1 & 1 \end{bmatrix} Mt(R)=MRMR2MR3=101011100101111101101111101=101111101 t ( R ) t(R) t(R) 的关系图如图7.3.8(b)所示,它其实是图7.3.8(a)中结点间「有长度大于 0 0 0 的路可达」关系的关系图。

虽然可用计算机编程,自动实现有限集合上「二元关系传递闭包」的计算,但是仍需要进行大量的位运算。下面介绍一个高效的求解传递闭包的算法,它是由[英]史蒂芬·沃舍尔 Stephen Warshall 于1960年提出的。

沃舍尔算法的实现,用到了内点的概念。给定有向图 G = ⟨ V , E ⟩ G = \langle V, E\rangle G=V,E V = { v 1 , v 2 , … , v n } V = \{ v_1, v_2, \dots, v_n\} V={v1,v2,,vn} x , y ∈ V x, y \in V x,yV ,若 x ,   v i 1 ,   v i 2 ,   … ,   v i s ,   y x,\ v_{i1},\ v_{i2},\ \dots,\ v_{is},\ y x, vi1, vi2, , vis, y G G G 中一条从 x x x y y y 的有向路,则称 v i 1 ,   v i 2 ,   … ,   v i s v_{i1},\ v_{i2},\ \dots,\ v_{is} vi1, vi2, , vis x x x y y y 的有向路的内点

定理7.3.3 设有向图 G = ⟨ V , E ⟩ G= \langle V, E\rangle G=V,E V = { v 1 , v 2 , … , v n } V = \{ v_1, v_2, \dots, v_n\} V={v1,v2,,vn} 1 ≤ k ≤ n 1 \le k \le n 1kn v i , v j ∈ V v_i, v_j \in V vi,vjV 。若 v i v_i vi v j v_j vj 存在所有内点属于 { v 1 , v 2 , … , v k } \{ v_1, v_2, \dots, v_k\} {v1,v2,,vk} 的路,当且仅当存在从 v i v_i vi v j v_j vj 的路、并且所有内点属于 { v 1 , v 2 , … , v k − 1 } \{ v_1, v_2, \dots, v_{k - 1} \} {v1,v2,,vk1} ,或者存在从 v i v_i vi v k v_k vk 的路和从 v k v_k vk v j v_j vj 的路、并且两者所有内点均属于 { v 1 , v 2 , … , v k − 1 } \{ v_1, v_2, \dots, v_{k - 1}\} {v1,v2,,vk1}
证明留作练习。
在定理7.3.3中,从 v i v_i vi v j v_j vj 并且内点属于 { v 1 , v 2 , … , v k − 1 } \{ v_1, v_2, \dots, v_{k - 1}\} {v1,v2,,vk1} 的路如图7.3.9(a)所示,从 v i v_i vi v k v_k vk 和从 v k v_k vk v j v_j vj 、并且两者所有内点均属于 { v 1 , v 2 , … , v k − 1 } \{v_1, v_2, \dots, v_{k - 1}\} {v1,v2,,vk1} 的路如图7.3.9(b)所示:

给定 M R M_R MR n n n 元素集合 V V V 上的二元关系 R R R 的关系矩阵, V = { v 1 , v 2 , … , v n } V = \{ v_1, v_2, \dots, v_n\} V={v1,v2,,vn} ,其关系图是有向图 G = ⟨ V , E ⟩ G = \langle V, E\rangle G=V,E 。设 1 ≤ k ≤ n 1 \le k \le n 1kn ,构造矩阵 W k = [ W i j k ] n × n W^k = [W_{ij}^k]_{n \times n} Wk=[Wijk]n×n ,其中 W i j k = 1 W_{ij}^k= 1 Wijk=1 表示存在从 v i v_i vi v j v_j vj 的路、并且内点属于 V = { v 1 , v 2 , … , v k } V = \{v_1, v_2, \dots, v_k\} V={v1,v2,,vk} ,则 M t ( R ) = W n M_{t(R)} = W^n Mt(R)=Wn

根据以上知识我们知道, W i j k = 1 W_{ij}^k = 1 Wijk=1 当且仅当存在从 v i v_i vi v j v_j vj 的路、并且所有内点属于 { v 1 , v 2 , … , v k − 1 } \{ v_1, v_2, \dots, v_{k - 1} \} {v1,v2,,vk1},或者存在从 v i v_i vi v k v_k vk 的路和从 v k v_k vk v j v_j vj 的路、并且两者所有内点均属于 { v 1 , v 2 , … , v k − 1 } \{ v_1, v_2, \dots, v_{k - 1}\} {v1,v2,,vk1} 。所以有: W i j k = W i j k − 1 ∨ ( W i k k − 1 ∧ W k j k − 1 ) W_{ij}^k = W_{ij}^{k - 1} \lor (W_{ik}^{k - 1} \land W_{kj}^{k - 1}) Wijk=Wijk1(Wikk1Wkjk1) 显然:

  • W 0 = M R W^0 = M_R W0=MR ,此时 W i j 0 = 1 W^0_{ij} = 1 Wij0=1 表示存在从 v i v_i vi v j v_j vj 的路、并且内点属于 ∅ \varnothing ,即 v i v_i vi v j v_j vj 直连、其间不经过任何其他点
  • k = 1 k = 1 k=1 时, W i j 1 = W i j 0 ∨ ( W i 1 0 ∧ W 1 j 0 ) W_{ij}^1 = W_{ij}^0 \lor (W_{i1}^0 \land W_{1j}^0) Wij1=Wij0(Wi10W1j0)
  • k = 2 k = 2 k=2 时, W i j 2 = W i j 1 ∨ ( W i 2 1 ∧ W 2 j 1 ) W_{ij}^2 = W_{ij}^1 \lor (W_{i2}^1 \land W_{2j}^1) Wij2=Wij1(Wi21W2j1)
  • ……
  • 如此下去,当 k = n k = n k=n 时, W i j n = W i j n − 1 ∨ ( W i n n − 1 ∧ W n j n − 1 ) W_{ij}^n = W_{ij}^{n - 1} \lor (W_{in}^{n - 1} \land W_{nj}^{n - 1}) Wijn=Wijn1(Winn1Wnjn1) ,就得到传递闭包的关系矩阵 M t ( R ) = W n M_{t(R)} = W^n Mt(R)=Wn

算法的过程描述如下:
(1)置新矩阵 W = ( M R ) n × n W = (M_R)_{n \times n} W=(MR)n×n 。。
(2)置 k = 1 k = 1 k=1 ;
(3)对 i = 1 , 2 , … , n i = 1, 2, \dots, n i=1,2,,n ,如果 W [ i ] [ k ] = 1 W[i][k] = 1 W[i][k]=1(即存在从 v i v_i vi v k v_k vk 的路、并且内点属于 ∅ \varnothing ),则有: W [ i ] [ j ] = W [ i ] [ j ] ∨ W [ k ] [ j ] W[i][j] = W[i][j] \lor W[k][j] W[i][j]=W[i][j]W[k][j]是否存在从 v i v_i vi v j v_j vj 的路、内点属于 { v 1 } \{v_1\} {v1} ,取决于是否存在从 v k v_k vk v j v_j vj 的路、并且内点属于 ∅ \varnothing
(4) k = k + 1 k = k + 1 k=k+1
(5)如果 k ≤ n k \le n kn ,则转步骤(3),否则停止。

以上沃舍尔算法,可以简述为:按列号顺序,对 R R R 的关系矩阵 W W W 的每一列中的元素、从上至下依次扫描每行,如果当前扫描的是第 i i i 行第 k k k 列、且遇到 1 1 1 时,将 1 1 1 所对应的第 i i i 行析取第 k k k 行、作为该行的新值。

【例6】设二元关系 R R R 的关系矩阵 M R = [ 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 ] M_R = \begin{bmatrix} 0 & 0 & 0 & 1\\ 1 & 0 & 1 & 0 \\ 1 & 0 & 0 & 1\\ 0 & 0 & 1 & 0 \end{bmatrix} MR=0110000001011010 ,求 R R R 的传递闭包。
解:
W 0 = M R = [ 0 0 0 1 1 0 1 0 1 0 0 1 0 0 1 0 ] W 1 = [ 0 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0 ] W 2 = [ 0 0 0 1 1 0 1 1 1 0 0 1 0 0 1 0 ] W 3 = [ 0 0 0 1 1 0 1 1 1 0 0 1 1 0 1 1 ] W 4 = M t ( R ) = [ 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1 ] W^0 = M_R = \begin{bmatrix} 0 & 0 & 0 & 1\\ 1 & 0 & 1 & 0 \\ 1 & 0 & 0 & 1\\ 0 & 0 & 1 & 0 \end{bmatrix} \\ {} \\ W^1 = \begin{bmatrix} 0 & 0 & 0 & 1\\ 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1\\ 0 & 0 & 1 & 0 \end{bmatrix} \\ {} \\ W^2 = \begin{bmatrix} 0 & 0 & 0 & 1\\ 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1\\ 0 & 0 & 1 & 0 \end{bmatrix} \\ {} \\ W^3 = \begin{bmatrix} 0 & 0 & 0 & 1\\ 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1\\ 1 & 0 & 1 & 1 \end{bmatrix} \\ {} \\ W^4 = M_{t(R)} = \begin{bmatrix} 1 & 0 & 1 & 1\\ 1 & 0 & 1 & 1 \\ 1 & 0 & 1 & 1\\ 1 & 0 & 1 & 1 \end{bmatrix} W0=MR=0110000001011010W1=0110000001011110W2=0110000001011110W3=0111000001011111W4=Mt(R)=1111000011111111

  • 42
    点赞
  • 200
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

memcpy0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值