查找有向图中 Universal Sink

问题

Exercises  22.1-6 - 算法导论 (英文第3版) 

看到该问题:"以邻接矩阵表示的图的多数算法, 时间需求都是O(V2),但有一些例外,查找有向图中是否存在 

Universal Sink(顶点入度|V|-1, 出度0), 时间需求是O(V)."

int i = 1;
int j = 1;

while (j <= n)
{
	if (G(i, j))
		i++;
	else
		j++;
}

int universalSink = i;

n 代表图中顶点数量

i,  j 范围是[1,n]


分析

如果顶点 i 是 Universal Sink, 根据定义可得出: 

(1) 邻接矩阵 i 行应该全部为 0.

(2) i 列除了G(i, i)为 0, 其他全部为 1.

(3) 有向图中只可能存在 1 个 Unversal Sink, 或者没有.


此算法假设存在 Unversal Sink, 然后对该点再进行验证. 从G(1, 1)开始, 如果G(i, j)为 0, 则 j 自增. 如果G(i, j)为 1, 则 i 自增. 

该方法有比较细致的地方, 如果自己构建几个不同的邻接矩阵, 可能更容易理解.

最终得到 i 的过程时间需求为O(V), 而验证 i 是否为 Universal Sink 同样为 O(V),  所以总时间需求为 O(V).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值