问题
如果我们用邻接矩阵来存储图,那么绝大多数图算法的运行时间都是Ω(|V|2)(V为一个图的顶点集),但还是有些例外。比如,给定一个有向图G的邻接矩阵A,我们可以在Ο(|V|)时间内判断图G是否包含一个通用汇点,即一个入度为|V|-1出度为0的顶点。请给出这样的算法。
Solution
命题1:若A[i,j]==1,i不是通用汇点
命题2:若A[i,j]==0,j不是通用汇点
这两条都可以用定义轻易证明
我们可以在O(V)时间内判断k是否是通用汇点,如下:
我们的判断函数里应该调用O(1)次这个函数
我们有如下
循环不变式:每次迭代前,i之前和j之前但不包括i的点都不是通用汇点。
注意到这个循环不变式与
“每次迭代前,j之前和i之前但不包括j的点都不是通用汇点”的区别
在这里我们可以把这个问题想象成在矩阵中找到这样一个十字:
行上全为0,列上全为1,交点处为0
这就是i与j地位有些许差异区别的原因
下面我来详细证明一下:
1.if A[i,j]==1, 表明i不可能是通用汇点,因为第i行上有了1,i++,依旧满足循环不变式
2.If A[i,j]==0, 说明第j列上有了0,如果j不在对角线上的话j就不是通用汇点,但会有i==j时的A[j,j]==0的情况,这显然是对的,这怎么办呢?这时候就体现出了我们这个循环不变式的优势了,j++即可,这时i还是原来的j,循环不变式依旧成立。
最后,如果i>V,则全都不符合,否则j>V,可能的只有i,检验后输出即可。
参考资料:http://www.ithao123.cn/content-8148817.html