如何在一次迭代中计算DFS中有向加权图的路径总权重?

时间:2016-04-21 13:49:22

标签: algorithm graph-algorithm graph-theory depth-first-search

G =(V,E) - 有向加权图。

D -> G (w:4)
D -> C (w:2)
D -> E (w:2)
C -> F (w:5)
C -> A (w:4)
B -> D (w:3)
B -> E (w:10)
G -> F (w:1)
E -> G (w:6)
A -> D (w:1)
A -> B (w:2)

picture

我使用DFS查找 START = A 节点到 END = F 节点之间的所有简单路径:

def find_all_paths(self, start, end, path=[]):
        path = path + [start]
        if start == end:
            return [path]
        if start not in self.edges:
            return []
        paths = []
        for node in self.edges[start]:
            if node not in path:
                paths.extend(self.find_all_paths(node, end, path))
        return paths

结果:

['A', 'D', 'G', 'F']
['A', 'D', 'C', 'F']
['A', 'D', 'E', 'G', 'F']
['A', 'B', 'D', 'G', 'F']
['A', 'B', 'D', 'C', 'F']
['A', 'B', 'D', 'E', 'G', 'F']
['A', 'B', 'E', 'G', 'F']

我需要得到这样的结果:

['A', 'D', 'G', 'F'], TOTAL_WEIGHT_OF_PATH = 6
['A', 'D', 'C', 'F'], TOTAL_WEIGHT_OF_PATH = 8
['A', 'D', 'E', 'G', 'F'], TOTAL_WEIGHT_OF_PATH = 10
....
....

其中TOTAL_WEIGHT_OF_PATH是路径中每条边的权重之和。 当然我可以在获得DFS结果后计算TOTAL_WEIGHT_OF_PATH值,但是我需要根据TOTAL_WEIGHT_OF_PATH将其计算为DFS步骤以进行截止搜索(例如,TOTAL_WEIGHT_OF_PATH应该< MAX_WEIGHT_OF_PATH)

1 个答案:

答案 0 :(得分:0)

嗯,请注意TOTAL_WEIGT_OF_PATHTWOP)到任意节点V(除根之外)TWOP到前一个节点U加上边缘的权重(U, V)。 root TWOP为0。

TWOP<sub>V</sub> = TWOP<sub>U</sub> + weight(U,V)

每当您在路径上展开新节点时,您只需将TWOP存储到此节点中,因此您不需要每次都计算它。

注意,如果您再次访问节点,使用不同的路径,则需要“计算”新的权重。