通用汇点

出自算法导论练习22.1-6
通用汇点universal sink是指入度为|v|-1,出度为0的结点.

多数以邻接矩阵为输入的图算法的运行时间为$$Omega(V^2)$$,但也有例外.
其中,判断是否存在通用汇点就是这样一种算法,只需要$$O(V)$$时间.

我们从经验出发,上升到理论.

有这样一个矩阵存在通用汇点,这个矩阵突出了通用汇点的特性,没有细枝末节的冗余细节.

[left( egin{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} ight) ag{1} ]

我们把((1))矩阵的特征再次突出,可以得到:

[left( egin{matrix} &&&1&\ &&&1&\ &&&1&\ 0&0&0&0&0\ &&&1& end{matrix} ight) ag{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|))的判断即可.

原文地址:https://www.cnblogs.com/Chuckqgz/p/7170785.html