【问题标题】:Finding all paths in directed graph with specific cost在有向图中以特定成本查找所有路径
【发布时间】:2012-11-17 23:48:54
【问题描述】:

假设我们有有向加权图。我们的任务是找到成本小于或等于 =

我认为可以通过修改后的 Dijkstra 算法来完成,但我不知道如何实现这样的事情。感谢您的帮助。

【问题讨论】:

  • 由于没有代码,我会将此标记为与语言无关。否则,准备因为一点努力或不是一个真正的问题而被否决。

标签: graph graph-algorithm path-finding directed-graph weighted


【解决方案1】:

您可以使用递归回溯来解决这个问题。在以下情况下终止递归:

  • 你到达目的地
  • 您访问了一个已经访问过的节点
  • 您的路径长度超过 N。

伪代码:

list curpath := {}
int dest, maxlen
def findPaths (curNode, dist):
    if curNode = dest:
        print curpath
        return
    if curNode is marked:
        return
    if dist > maxlen:
        return
    add curNode to curpath
    mark curNode
    for nextNode, edgeDist adjacent to curNode:
        findPaths(nextNode, dist + edgeDist)
    remove last element of curpath

【讨论】:

  • 非常感谢!算法工作得很好,除了(IMO),长度 N 的条件应该是函数中的第一个条件。否则,我们还会将到达目的地但成本超过 N 的路径添加到列表中。
【解决方案2】:

你想在有向图中找到所有从 A 点到 B 点的路径,比如 A 到 B 的距离小于 N,并且允许 A = B 的可能性。

Dijkstra 的算法是为在图中找到从一个点到另一个点的最小路径而设计的,可以这么说,并在此过程中丢弃了许多其他点。因此,如果我们包含重叠的路径,它不能用于查找所有路径。

您可以通过在图中进行广度优先搜索来实现您的目标,将覆盖树的每个分支保持在其堆栈中(如果节点连接得很好,您将获得大量分支),然后停止深度N。所有到达B的分支都被搁置一旁。一旦深度 N 被覆盖,你就丢弃所有没有到达 B 的路径。剩下的路径,以及放在一边的路径放在一起成为你的解决方案。

您可以选择添加路径中没有循环的限制,在这种情况下,您将在搜索的每个步骤中检查新到达的节点是否已经在目前覆盖的路径中,如果出现则修剪该路径就是这样。

这是一些伪代码:

function find_paths(graph G, node A):
list<path> L, L';

L := empty list;
push path(A) in L;
for i = 2 to N begin
   L' := empty list;
   for each path P in L begin
       if last node of P = B then push P in L'
       else
       for each successor S of last node in P begin
           if S not in P then
              path P' := P;
              push S in P';
              push P' in L';
           endif
       end
       endif
   end
   L := L';
end

for each path P in L begin
  if last node of P != B
  then remove P from L
  endif
end
return L;

【讨论】:

  • 如果您不需要重叠路径,回溯答案就是您所需要的。
【解决方案3】:

我认为 jma127 建议的递归回溯算法的可能改进(取决于问题的大小和最大成本 N)是预先计算每个节点到目的地的最小距离(最短路径树) ,然后将以下内容附加到测试的条件以终止您的递归:

  • 您将到达一个节点,其与目的地的最小距离大于最大成本 N 减去到达当前节点所经过的距离。

如果需要针对不同的源和目的地多次运行该算法,则可以运行,例如,一开始就使用 Johnson 算法来创建所有节点对之间最短路径的矩阵。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多