我想要一个算法或指针,以进一步研究如何找到一个固定长度的路径之间的两个节点在一个加权无向图。
从给定节点到给定长度的给定节点的简单路径是NP完全的:哈密顿循环问题是这个类的一个问题,它是NP完全的。
如果边是加权的,那么子集和问题就是这个问题的一个特例,所以我们仍然是NP完全的
在这两种情况下,您都可以枚举路径,修剪不简单的路径或在theta(b^len)
expected time中过长的路径,其中b
是分支因子(平均出度)。
找到允许重复边的路径(有时称为行走)可以通过[length]矩阵乘法完成,总计O(v^3*len)
时间复杂度或更好。
让A
表示图的邻接矩阵。然后,A^len
保存每对顶点之间长度len的路径数。您可以在乘法过程中使用1 1=1
(布尔加法-不确定它如何与高级矩阵乘法算法配合使用),这样您只会得到这样一条路径的存在,但同时可以避免整数溢出。
准备A^1。。A^len
(O(n^3 len)
)。然后,对于1中的每个距离
,找到一个顶点d
。。lenv[d]
,该顶点是v[d-1]
的子节点,并且具有到目标的len-d
-长路径(O(n len)
)。
如果您只需要知道这样一条路径是否存在,那么您不需要a。。A^len
,仅A^len
。您可以通过平方和乘法算法在时间O(n^3 log(len))
中计算,甚至与铜匠威诺格拉德矩阵乘法算法结合时,也可以在时间O(n^2.37 log(len))
中计算。
或者,您可以只搜索[node x distance]
状态空间,并在O(n*b*len)
中完成。
给定一个图,如何在图中的两个节点之间找到长度为X的路径。理想情况下,路径访问边缘的次数不应超过一次。
我有一个有向加权图
我有一个有向加权图G,其中权重是过渡的持续时间。 我使用DFS编写了两个顶点之间的所有路径搜索算法,并进行了修改:搜索将继续,直到路径的总权重(其各部分的权重之和)小于某个值。 我的代码在小图中工作,但在大图中(| V |=1800,| E |=50870)它会冻结。
我试图找到一种实现DFS搜索的方法,通过使用堆栈,而不是使用递归,在表示为邻接列表的有向图上找到从给定节点开始的最长路径的长度。具体地说,我希望实现DFS搜索,以便在运行时,如下图所示填充堆栈。。 如果这还不清楚的话,这段视频是我希望在程序运行时如何构建堆栈的(DFS大约在12:45开始:https://www.youtube.com/watch?v=pcKY4hjDrxk 但我正在努力找到一种方
你知道如何克服这个问题吗?
路径的“length”是路径中的边数。 给定一个源和一个目的顶点,我想求出给定长度k的从源顶点到目的顶点的路径数。 > 我们可以任意多次访问每个顶点,因此,如果从到的路径如下:被认为是有效的。这意味着可以有循环,我们可以通过目的地不止一次。 由于答案可能很大,所以要以模的形式报告。 以下是我到目前为止的想法: 我们可以使用广度优先搜索而不将任何顶点标记为已访问的,在每次迭代中,我们跟踪该路径所需的