码迷,mamicode.com
首页 > 编程语言 > 详细

算法导论习题 通用汇点

时间:2017-08-20 18:26:14      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:节点   邻接矩阵   universal   算法导论   and   围墙   开始   判断   行号   

来自习题22.1-6

给出O(V)时间算法判断有向图G是否存在一个通用汇点(universal sink)。通用汇点指的是入度为|V|-1,出度为0的节点。

思路:

考虑图的邻接矩阵A,假设i为通用汇点,则对于0<=j<n,有A[i][j]=0,且对于所有0<=k<n and k != i,有A[k][i] = 1,注意这里k!=i

相当于在子矩阵A[0..i][0..i]的右边和下边造了一个围墙,最下边全是0,最右边除了右下角外全是1

那么可以令游标从矩阵左上角开始,遇1向下,逢0向右,直到行或列超出矩阵A的界限,注意不是子矩阵。此时若游标所在行没有超出界限,那和这个行号 r 就可能是通用汇点编号。

接下来再根据定义验证 r 是否就是通用汇点。因为可能存在以下的情况:

x x x x 1 x x x
x x x x 1 x x x
x x x x 1 x x x
x x x x 1 x x x
0 0 0 0 0 0 0 0
x x x x 0 x x x
x x x x 0 x x x
x x x x 0 x x x

矩阵第5行所表示的节点显然不是通用汇点。

算法导论习题 通用汇点

标签:节点   邻接矩阵   universal   算法导论   and   围墙   开始   判断   行号   

原文地址:http://www.cnblogs.com/venux021/p/7400569.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!