簡體   English   中英

在加權有向圖中使用 DFS 查找兩個節點之間的所有路徑

[英]Find all paths between two nodes using DFS in weighted directed graph

我有一個有向加權G ,其中權重是過渡的持續時間。

我使用修改后的 DFS 編寫了兩個頂點之間的所有路徑搜索算法:搜索一直持續到路徑的總權重(其各部分權重的總和)將小於某個值。

我的代碼適用於小圖,但在大圖 (|V|=1800, |E|=50870) 中它凍結。

def find_paths(self, start, end, weight_limit=10):
        res = []

        def dfs(start, end, path=[], weight=0):
            path = path + [start]
            if len(path) > 1:
                weight += self.weights[(path[-2], start)]
            if weight > weight_limit:
                return []
            if start == end:
                res.append((path, weight))
                return [path]
            if start not in self.adjacent:
                return []
            paths = []
            for node in self.adjacent[start]:
                if node not in path:
                    paths.extend(dfs(node, end, path, weight))
            return paths

        dfs(start, end)
        return res

您的代碼似乎是正確的(尤其是因為它適用於小圖)。

問題是節點之間可能有很多路徑。 對於全連接圖,路徑的數量是 N 的數量級! 這是很多。 因為你需要所有這些,你的程序會很慢(特別是如果你用完了內存並且需要把東西交換到磁盤)。

如果您像在代碼中那樣限制最大總重量,假設所有重量都是一個,那么您仍然在 O(weight) 中運行,我假設您將其設置為一個大值,因為圖表很大。

您需要弄清楚是否真的需要所有這些路徑。

如果您正在尋找最短路徑,請使用 Dijkstra 或尋找最短路徑的東西。

暫無
暫無

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

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