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