Python DFS最短路径搜索,带加权无向图

时间:2015-02-06 21:10:24

标签: python recursion dictionary graph-theory depth-first-search

我在解析这个图表字典时遇到了问题:

routes = {'a': [('b', 5.0), ('c', 8.0)], 'c': [('a', 8.0), ('d', 2.0)], 
'b' [('a', 5.0), ('d', 6.0)], 'e': [('d', 12.0), ('g', 3.0)], 
'd':  [('b', 6.0),('c', 2.0), ('e', 12.0), ('f', 2.0)], 'g': [('e', 3.0),
('f', 7.0)],'f': [('d',2.0), ('g', 7.0)]}

如何在通过DFS搜索查看2个键时运行字典时分离出每个边的值?我对dict不是很熟悉。

到目前为止,我有,

def dfs(graph, start, end, path):
    path = path + [start]
    if start == end: 
        paths.append(path)
    for node in graph.childrenOf(start):
        if node not in path:
            dfs(graph, node, end, path)

我需要返回最小的加权路径,所以我需要将值中的数字分开并在程序运行时求和。

2 个答案:

答案 0 :(得分:1)

您可以使用词典词典来构建图表:

routes = {'a': {'b': 5.0, 'c': 8.0}, 'c': {'a': 8.0, 'd': 2.0}}

然后routes['a']['b']将返回权重,在这种情况下为5.0。如果您需要获取节点的所有子节点,则可以执行routes['a'].keys()并返回['c', 'b']

答案 1 :(得分:0)

routes是您的图表,采用邻接列表格式。每个键都是一个节点,该值是(other_node, edge_weight)元组的列表。所以你要找的是“graph.childrenOf”应该如何工作。

假设start, end是简单的字符串节点名称(如'a'),您可以在字典中查找它们;例如graph[a]会给你[('b', 5.0), ('c', 8.0)]。您可以使用python的漂亮的内置元组解包直接迭代节点和权重,如下所示:

# replace your for loop with this:
for node, weight in graph[start]: