Algorithm 在加权图中寻找从节点A到B的所有路径,权重为K或更低

Algorithm 在加权图中寻找从节点A到B的所有路径,权重为K或更低,algorithm,graph,path,graph-theory,Algorithm,Graph,Path,Graph Theory,我有一个带源和目标的有向图。每个边的权重为1。节点没有权重。 我需要找到一种有效的方法(我写在C#上,但我不认为这是相关的),找到从源到目标的所有路径,路径的权重(或边的数量,与这些细节相同)小于或等于某个值,我们称之为K 我认为一种可能的方法是对从1到K的每一个值运行Dijkstra,但是由于K可能非常大,所以它不会有效。 我一直在寻找一些答案,但也有一个非常类似的问题,我没有发现这个答案是有益的 ()您只需从源到目标运行DFS即可分析所有路径。 如果必须找到在到达深度K返回0和到达目标返回1

我有一个带源和目标的有向图。每个边的权重为1。节点没有权重。 我需要找到一种有效的方法(我写在C#上,但我不认为这是相关的),找到从源到目标的所有路径,路径的权重(或边的数量,与这些细节相同)小于或等于某个值,我们称之为K

我认为一种可能的方法是对从1到K的每一个值运行Dijkstra,但是由于K可能非常大,所以它不会有效。 我一直在寻找一些答案,但也有一个非常类似的问题,我没有发现这个答案是有益的


()

您只需从源到目标运行DFS即可分析所有路径。 如果必须找到在到达深度K返回0和到达目标返回1时停止的路径数,并且如果还需要描述路径,则可以在使用DFS进行探索时构建树。 复杂性为O(E),其中E是边数

这里是python和伪代码的混合:

def DFS(节点、深度、目标、访问、图形、最大深度):
已访问。添加(节点)
如果深度>=最大深度:
返回空值
elif节点==目标:
返回新的树节点(节点)
其他:
子树=列表()
对于图[node]中已连接的_节点:
如果连接的\u节点未被访问:
子树=DFS(连接的节点,深度+1,目标,访问,图形,最大深度)
如果子树!=无效的:
sub_trees.append(sub_tree)
如果长度(子树)>0:
树节点=新树节点(节点)
对于sub_树中的sub_树:
树节点。添加子树(子树)
返回树节点
其他:
返回空值
tree=DFS(源,0,目标,set(),图,K)

PS:此解决方案也可以很容易地适应加权图

@烧杯此解决方案已经适应要求。他说每边有1的重量,他认为重量是边数。那么你能告诉我哪些路径没有被覆盖吗?你是对的,我误读了边缘权重。我的错。包含循环的路径不会被找到(我不知道这是否是一个要求),除了这段代码没有找到实际的路径,只有计数。我也不确定你的复杂性分析。在我看来,可能有O(N)条路径,每个路径都包含O(N)条边。我认为这种复杂性应该足够好了。我需要考虑如何返回路径,我相信有一些图形算法的目录,我可以使用它们。@bicker根据定义,路径不包含循环(我们将谈论步行),那么关于DFS时间复杂性的分析,您可以在internet上轻松找到资源。用两个词来说就是O(E),因为每个边最多检查一次time@AlonH对于路径,我的方法是这样创建一个树:当到达目标时创建一个节点并返回它,当超过K时创建一个空节点并返回它,在其他情况下,如果任何递归调用返回一个非空节点,则创建一个节点,附加从子节点返回的所有节点并返回它,否则返回空节点。明天(在中欧时区),我将更新答案。起初我不想写代码,因为它会引入很多样板语言。如果答案能解决你的问题,一定要接受;)路径的数量可能是指数级的,因此“查找”“所有”路径不能称为“有效”。如果你解释为什么你认为你想这样做,也许我们可以提供一个有效的方法来实现你的真正目标。最终我得到了两个寄存器之间的逻辑门圈,我需要返回从一个寄存器到另一个寄存器的所有路径,这些路径等于或小于某个K。