图直径的算法?

标签 algorithm graph language-agnostic graph-algorithm

如果你有一个图,并且需要找到它的直径(这是两个节点之间的最大距离),你如何在 O(log v * (v + e)) 复杂性。

维基百科说你可以使用 Dijkstra's algorithm 来做到这一点使用二进制堆。 但我不明白这是怎么回事。有人可以解释一下吗?

或者显示一个伪代码?

最佳答案

我知道我迟到了一年,但我不认为这些答案是正确的。 OP在评论中提到边缘未加权;在这种情况下,最佳算法的运行时间为 O(nω log n)(其中 ω 是矩阵乘法的指数;目前 Virginia Williams 的上限为 2.373)。

该算法利用了未加权图的以下属性。设 A 是图的邻接矩阵,每个节点都添加了自循环。那么 (Ak)ij 是非零的当且仅当 d(i, j) ≤ k。我们可以使用这个事实通过计算 Ak 的 log n 值来找到图形直径。

算法的工作原理如下:设 A 为图的邻接矩阵,并为每个节点添加了自循环。设 M0 = A。当 Mk 包含至少一个零时,计算 Mk+1 = Mk2.

最终,您会找到一个包含所有非零元素的矩阵 MK。根据上面讨论的性质,我们知道 K ≤ log n;因此,到目前为止,我们只执行了 O(log n) 次矩阵乘法。我们现在可以继续在 MK = A2K 和 MK-1 = A< 之间进行二分查找sup>2K-1。设 B = MK-1 如下。

设置直径 = 2k-1。对于 i = (K-2 ... 0),执行以下测试:

将 B 乘以 Mi 并检查结果矩阵是否为零。如果我们找到任何零,则将 B 设置为该矩阵乘积,并将 2i 添加到 DIAMETER。否则,什么也不做。

最后,返回DIAMETER。

作为一个次要的实现细节,可能有必要在每次执行矩阵乘法后将矩阵中的所有非零元素设置为 1,这样值就不会变得太大而难以写下少量的时间。

关于图直径的算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15646307/

相关文章:

algorithm - Gold Rader 位反转算法

math - float 学坏了吗?

java - 在哪里可以找到 Java 中基于标准 Trie 的 map 实现?

c++ - 从函数绘制图形

c - 使用最少的数组查找数组组合以覆盖所有元素

r - 在 igraph 中使用 closeness() 时出现警告消息

database - neo4j - 没有过程 CALL dbms.security.listRoles()

language-agnostic - 什么是幂等操作?

将列表操作转换为基于索引的算法

algorithm - 理解为什么弗洛伊德的龟兔赛跑算法适用于整数数组