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:
路径为1到3、1到5、2到6、2到5、4到3、1到4。
编辑:边缘的反转将不起作用,我目前的最佳选择是先进行BFS,然后在每个节点上进行DFS,直到达到k的深度。
答案 0 :(得分:1)
您可以考虑使用基本相邻矩阵M
,其中元素不是0
或1
,以表示连接,但它们保留大小为{{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