《算法导论》第22章:基本的图算法

22.1 图的表示

课后题 22.1-4 通用汇点 O(V)

日期:20191025
来源:《算法导论》
参考资料:http://www.voidcn.com/article/p-qxvnukms-bqn.html
分析过程:无
结果:如下
问题

如果我们用邻接矩阵来存储图,那么绝大多数图算法的运行时间都是Ω(|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,检验后输出即可。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值