如何在有向图中找到彼此相距k的所有节点(探索图中的每个边)?

时间:2019-10-24 03:57:34

标签: algorithm graph depth-first-search breadth-first-search

0

我正在研究一个需要查找彼此之间距离为k的所有节点的问题。因此,如果k = 3,那么我需要找到它们之间以距离3的路径连接的所有节点。没有自边缘,所以如果我的边指向s,则s不能直接指向i。我想我想到了这里的两个实现,都涉及BFS。我注意到一种极端情况,其中BFS可能不会访问所有边缘,因为可能已经访问了节点。

在每个节点上执行BFS。跟踪某个数组中每个节点的“级别”,其中distance [0]是根节点,distance1是与根节点相邻的所有节点,distance [2]是根节点的孙子节点,因此上。然后,要查找距离为k的所有节点,我们要看一下distance [i]和distance [i + k]。

使用与上述相同的距离算法执行一次BFS,但不要在每个节点上执行BFS。反转所有边缘,然后再次进行BFS查找任何丢失的路径。这比方法1的时间复杂度要好得多,但是我不确定它是否会真正探索每个边缘和路径(在我的测试案例中似乎如此)。

是否有更好的方法?例如,此图中k = 2:

enter image description here

路径为1到3、1到5、2到6、2到5、4到3、1到4。

编辑:边缘的反转将不起作用,我目前的最佳选择是先进行BFS,然后在每个节点上进行DFS,直到达到k的深度。

1 个答案:

答案 0 :(得分:1)

您可以考虑使用基本相邻矩阵M,其中元素不是01,以表示连接,但它们保留大小为{{1 }}。

例如 对于2-> 5,您将存储k(因为在节点2和5之间存在长度为1且长度为2的路径)

M(2,5) = {1,2}a的两个元素b

M定义为:

a * b

ab_res = {} //a set without dupplicates for all size i in a for all size j in b s = i+j append(s) to ab_res ab_res; 定义为:

a + b

此方法不允许重新计算大小较小的路径。它也可以循环使用。

下面是未经优化的版本,用于说明算法。

ab_res = {}
for all size i in a
    append(i) to ab_res
for all size j in a
    append(j) to ab_res