算法导论 22.1-4 通用汇点 O(V)

来源:互联网 发布:免费数据库同步软件 编辑:程序博客网 时间:2024/05/16 09:08

问题 

如果我们用邻接矩阵来存储图,那么绝大多数图算法的运行时间都是Ω(|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

这就是ij地位有些许差异区别的原因

下面我来详细证明一下:

1.if A[i,j]==1, 表明i不可能是通用汇点,因为第i行上有了1i++,依旧满足循环不变式

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

阅读全文
0 0
原创粉丝点击