【问题标题】:Algorithm to Compute square of a directed graph(represented in form of an adjacency list)计算有向图平方的算法(以邻接表的形式表示)
【发布时间】:2017-04-10 04:20:07
【问题描述】:
我正在构建一种算法来计算有向图的 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 的路径
否则继续
【问题讨论】:
标签:
algorithm
graph
graph-algorithm
【解决方案1】:
使用BFS(广度优先搜索)可以及时O(VE)解决问题。 BFS 的问题在于它遍历了图形 level by level。这意味着它首先从source vertex 遍历distance of 1 处的所有顶点。然后它从source vertex 遍历distance of 2 处的所有顶点,依此类推。所以我们可以利用这个事实并在到达distance of 2 的顶点时终止我们的BFS。
以下是伪代码:
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
}
}
由于BFS 需要时间O(V + E),我们为每个顶点调用它,所以总时间为O(V(V + E)) = O(V^2 + VE) = O(VE) 。记住每次BFS 遍历都从新的数据结构开始。