通用汇点
出自算法导论练习22.1-6
通用汇点universal sink是指入度为|v|-1,出度为0的结点.
多数以邻接矩阵为输入的图算法的运行时间为$$\Omega(V^2)$$,但也有例外.
其中,判断是否存在通用汇点就是这样一种算法,只需要$$O(V)$$时间.
我们从经验出发,上升到理论.
有这样一个矩阵存在通用汇点,这个矩阵突出了通用汇点的特性,没有细枝末节的冗余细节.
\[\left(
\begin{matrix}
0&0&0&1&0\\
0&0&0&1&0\\
0&0&0&1&0\\
0&0&0&0&0\\
0&0&0&1&0
\end{matrix}
\right) \tag{1}
\]
我们把\((1)\)矩阵的特征再次突出,可以得到:
\[\left(
\begin{matrix}
&&&1&\\
&&&1&\\
&&&1&\\
0&0&0&0&0\\
&&&1&
\end{matrix}
\right) \tag{2}
\]
可以进行一个感性的认知,即
沿着1与0的路线,让一个指向(x,y)的坐标"滑"到\((2)\)的"出口"
这个认知是对的.
对于\((2)\)我们从\(p=(1,1)\)出发,遇到1就将行数加1,遇到0就将列数加1,可以最终达到\((4,5)\),于是便验证了universal sink存在.
对于所有存在\(universal-sink = k\)的矩阵,\(p\)经过这个过程都会在\(e=(k,|V|)\)处停下.
而这个过程只需要\(O(|V|)\)
但是,题目是判断存在,因此还要考虑不存在的情况.
如果universal sink不存在,判断的方式很简单,只要对\(e\)进行一次\(O(|V|)\)的判断即可.