我正在构建一个算法来计算有向图的G ^ 2,有向图是一种邻接列表的形式,其中G ^ 2 =(V,E'),其中E'定义为(u,v)∈E '如果在G中u和v之间有一条长度为2的路径 . 我很好地理解了这个问题并找到了一个我认为是正确的算法,但是算法的运行时间是O(VE ^ 2)其中V是顶点数和E是图的边数 . 我想知道如何在O(VE)时间内做到这一点,以使其更有效率?
这是算法,我提出:
顶点中的顶点
邻居中的邻居
在邻居中的n
如果(N!=邻居)
那么 - > if(n.value == neighbor)
将其添加到新的邻接列表中
打破; //这意味着我们在顶点和邻居之间找到了大小为2的路径
否则继续
1 回答
问题可以使用
BFS
(广度优先搜索)在时间 O(VE) 中解决 . 关于BFS
的事情是,它遍历图level by level
. 这意味着它首先遍历source vertex
处的distance of 1
处的所有顶点 . 然后它从source vertex
遍历distance of 2
处的所有顶点,依此类推 . 因此,当我们到达distance of 2
的顶点时,我们可以利用这个事实并终止我们的BFS
.以下是伪代码:
由于
BFS
需要时间 O(V + E) 并且我们为每个顶点调用它,因此总时间为 O(V(V + E)) = O(V^2 + VE) = O(VE) . 请记住从每个BFS
遍历的新数据结构开始 .