通用汇点

出自算法导论练习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|)\)的判断即可.

posted on 2017-07-15 15:08  Chuckqgz  阅读(...)  评论(...编辑  收藏

导航