簡體   English   中英

在加權圖中查找從節點 A 到 B 的所有路徑,權重為 K 或更低

[英]Finding all paths in weighted graph from node A to B with weight of K or lower

我有一個有向圖,有源和目標。 每條邊的權重為 1。節點沒有權重。 我需要找到一種有效的方法(我寫在 C# 上,但我認為它不相關),找到從源到目標的所有路徑,即路徑的權重(或邊數,即與那些細節相同)小於或等於某個值,我們稱之為K。

我認為一種可能的方法是對從 1 到 K 的每個值運行 Dijkstra,但由於 K 可能非常大,因此效率不高。 我一直在尋找一些答案,但也有一個與我非常相似的問題,我沒有發現這個答案有幫助。

在直接加權圖中找到從節點 A 到節點 B 的所有簡單路徑,且權重之和小於某個值?

您可以簡單地運行從源到目標的 DFS 來分析所有路徑。 如果您必須找到在到達深度 K 時停止的路徑數,返回 0,到達目標時返回 1,如果您還需要描述路徑,則可以在使用 DFS 探索時構建一棵樹。 復雜度將為 O(E),其中 E 是邊數

這里是 python 和偽代碼的混合:

def DFS(node, depth, target, visited, graph, max_depth):
  visited.add(node)
  if depth >= max_depth:
    return Null
  elif node == target:
    return new_tree_node(node)
  else:
    sub_trees = list()
    for connected_node in graph[node]:
      if connected_node not in visited:
        sub_tree = DFS(connected_node, depth+1, target, visited, graph, max_depth)
        if sub_tree != Null:
          sub_trees.append(sub_tree)

    if length(sub_trees) > 0:
      tree_node = new_tree_node(node)
      for sub_tree in sub_trees:
         tree_node.add_child(sub_tree)
      return tree_node
    else:
      return Null

tree = DFS(source, 0, target, set(), graph, K)

PS:這個解決方案也可以很容易地適應加權圖

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM