问题
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).