我正在构建一种算法来计算有向图的G ^ 2,该有向图是邻接列表的一种形式,其中G ^ 2 =(V,E'),其中E'如果在G和u之间存在长度为2的路径,则定义为(u,v)∈E'。我很好地理解了这个问题并找到了一个我认为是正确的算法,但是算法的运行时间是O(VE ^ 2)其中V是顶点数,E是图的边数。我想知道如何在O(VE)时间内做到这一点,以提高效率?
这是算法,我想出了:
顶点中的顶点
在邻居中的邻居
在邻居中的n
如果(N!=邻居)
则 - >如果(n.value ==邻居)
将其添加到新的邻接列表中
打破; //这意味着我们在顶点和邻居之间找到了一条大小为2的路径
否则继续
答案 0 :(得分:4)
可以使用BFS
(广度优先搜索)及时解决问题 O(VE)。关于BFS
的问题是,它遍历图level by level
。这意味着它首先遍历来自distance of 1
的{{1}}处的所有顶点。然后它遍历来自source vertex
的{{1}}处的所有顶点,依此类推。因此,当我们到达distance of 2
的顶点时,我们可以利用这一事实并终止我们的source vertex
。
以下是伪代码:
BFS
由于distance of 2
需要时间 O(V + E),我们会为每个顶点调用此值,因此总时间为 O(V(V + E)) = O(V ^ 2 + VE) = O(VE)。请记住,每次For each vertex v in V
{
Do a BFS with v as source vertex
{
For all vertices u at distance of 2 from v
add u to adjacency list of v
and terminate BFS
}
}
次遍历都要使用新的数据结构。