求传递闭包的 Warshall 算法详解
过程详情
【例子】关系的矩阵是:
$$ \boldsymbol{W}_{0}=\left[\begin{array}{llll} 0 & 0 & 0 & 1 \\ 1 & 0 & 1 & 0 \\ 1 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{array}\right] $$求传递闭包。
【分析与解答】
我们看第 1 列:$\pmatrix{0\\1\\1\\0}$。
$\pmatrix{\color{red}0\\1\\1\\0}$ $a_{11}=0$ 跳过。
$\pmatrix{0\\\color{blue}1\\1\\0}$ $a_{\color{green}2\color{red}1}=1$,则 $a_{\color{red}1}$ 行加到 $a_{\color{green}2}$ 行:
$$ \boldsymbol{W}=\left[\begin{array}{llll} \color{blue}0 & \color{blue}0 & \color{blue}0 & \color{blue}1 \\ 1+\color{blue}0 & 0+\color{blue}0 & 1+\color{blue}0 & 0+\color{blue}1 \\ 1 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{array}\right] $$得到:
$$ \boldsymbol{W}=\left[\begin{array}{llll} 0 & 0 & 0 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{array}\right] $$$\pmatrix{0\\1\\\color{blue}1\\0}$,$a_{31} = 1$,则 $a_1$ 行加到 $a_3$ 行,得到:
$$ \boldsymbol{W}=\left[\begin{array}{llll} 0 & 0 & 0 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{array}\right] $$$\pmatrix{0\\1\\1\\\color{red}0}$,$a_{41} = 0$,跳过。
接下来是第二列(注意:不是原矩阵的第二列,而是上面处理后最后的矩阵的第二列,下同):
我们看第 2 列:$\pmatrix{0\\0\\0\\0}$。全是零,意味着 $a_{i2}$ 都跳过处理。
我们看第 3 列:$\pmatrix{0\\1\\0\\1}$
注意到 $a_{23} = 1$,则 $a_3$ 行加到 $a_2$ 行,得到:
$$ \boldsymbol{W}=\left[\begin{array}{llll} 0 & 0 & 0 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1 \\ 0 & 0 & 1 & 0 \end{array}\right] $$注意到 $a_{43} = 1$,则 $a_3$ 行加到 $a_4$ 行,得到:
$$ \boldsymbol{W}=\left[\begin{array}{llll} 0 & 0 & 0 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1 \\ 1 & 0 & 1 & 1 \end{array}\right] $$我们看第 4 列:$\pmatrix{1\\1\\1\\1}$
注意到 $a_{14}\sim a_{44} = 1$,也就是 $a_4$ 行依次加到上面各行:
$$ \boldsymbol{W}=\left[\begin{array}{llll} 1 & 0 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1 \\ 1 & 0 & 1 & 1 \end{array}\right] $$$$ \boldsymbol{W}=\left[\begin{array}{llll} 1 & 0 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 0 & 0 & 1 \\ 1 & 0 & 1 & 1 \end{array}\right] $$$$ \boldsymbol{W}=\left[\begin{array}{llll} 1 & 0 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 0 & 1 & 1 \end{array}\right] $$$$ \boldsymbol{W}=\left[\begin{array}{llll} 1 & 0 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 0 & 1 & 1 \\ 1 & 0 & 1 & 1 \end{array}\right] $$这就是最终正确答案。
例题
【例子】计算传递闭包之于:
$$ \boldsymbol{A}= \begin{bmatrix} 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 \\ 1 & 0 & 1 & 0 \end{bmatrix} $$【分析与解答】
按列从左到右,每列按行从上到下扫描:
$(4,1) = 1$,故:
$$ \boldsymbol{T}= \begin{bmatrix} 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 \\ 1 & 1 & 1 & 0 \end{bmatrix} $$$(1,2) = 1$,故:
$$ \boldsymbol{T}= \begin{bmatrix} 0 & 1 & 0 & 1 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 \\ 1 & 1 & 1 & 0 \end{bmatrix} $$$(4,2) = 1$,故:
$$ \boldsymbol{T}= \begin{bmatrix} 0 & 1 & 0 & 1 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} $$$(4,3) = 1$,故:
$$ \boldsymbol{T}= \begin{bmatrix} 0 & 1 & 0 & 1 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} $$$(1,4) = 1$,故:
$$ \boldsymbol{T}= \begin{bmatrix} 1 & 1 & 1 & 1 \\ 0 & 0 & 0 & 1 \\ 0 & 0 & 0 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} $$$(2,4) = 1$,故:
$$ \boldsymbol{T}= \begin{bmatrix} 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 \\ 0 & 0 & 0 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} $$$(4,4) = 1$,故:
$$ \boldsymbol{T}= \begin{bmatrix} 1 & 1 & 1 & 1 \\ 1 & 1 & 1 & 1 \\ 0 & 0 & 0 & 0 \\ 1 & 1 & 1 & 1 \end{bmatrix} $$🦔最终解。