【问题标题】:Minimum weight BFS graph span of undirected graph无向图的最小权重BFS图跨度
【发布时间】:2017-08-16 19:11:30
【问题描述】:

这可能充其量只是一个初学者问题,但一直在玩图表,并在各种练习中实施 BFS 搜索。我不太清楚如何实际跟踪我访问过的边的权重,以便创建图形的最小完整跨度。我的图表格式为:

{0: [(1, 1), (2, 1)], 1: [(0, 1), (2, 1)], 2: [(1, 1), (0, 1)]}

其中第一个顶点为0,相邻顶点为1和2,权重分别为1和1。所以更清楚地说,图字典中的键代表顶点,键值中的每个元组代表一个顶点、权重对。

所以我的 BFS 功能是:

def bfs(graph, start):
    """returns total weight needed to visit 
    each vertice in the graph with the minimum
    overall weight possible"""
    if [] in graph.values():
        return "Not Possible"
    weight = 0
    visited, queue = set(), [start]
    while queue:
        vertex = queue.pop(0)
        if vertex not in visited:
            visited.add(vertex)
            for node in graph[vertex]:
                queue.append(node[0])
                weight += node[1]
    return weight

目前,使用我的原始图表,此函数将返回 6,它应该是 2。我认为这是因为它正在迭代每个顶点并添加相邻的权重,即使它们已经被访问过。 这实际上也不会选择最小加权路径,它只会跟踪它所采取的路径的权重,无论它可能是什么。我该如何解决这个问题?

一个更长的例子:

{0: [(1, 5), (2, 7), (3, 12)], 1: [(0, 5), (2, 9), (4, 7)], 2: [(0, 7), (1, 9), (3, 4), (4, 4), (5, 3)], 3: [(0, 12), (2, 4), (5, 7)], 4: [(1, 7), (2, 4), (5, 2), (6, 5)], 5: [(2, 3), (3, 7), (4, 2), (6, 2)], 6: [(4, 5), (5, 2)]}

这会产生134 的权重,其中正确答案应该是23 是否有一些我缺少的算法可以跟踪加权边缘并从中选择最佳路径? 我知道 Dijkstra 算法,但据我所知,它适用于具有指定起点和终点的路径,而不是完整的图形跨度?

【问题讨论】:

    标签: python algorithm graph


    【解决方案1】:

    Dijkastra 的算法和 bfs 在查找两个顶点之间的最小路径时很有用。但是,如果您想找到最小生成树,请改用 Kruskal 的算法。

    这里是链接: https://en.wikipedia.org/wiki/Kruskal%27s_algorithm

    伪代码:

    KRUSKAL(G):
    1 A = ∅
    2 foreach v ∈ G.V:
    3    MAKE-SET(v)
    4 foreach (u, v) in G.E ordered by weight(u, v), increasing:
    5    if FIND-SET(u) ≠ FIND-SET(v):
    6       A = A ∪ {(u, v)}
    7       UNION(u, v)
    8 return A
    

    使用union-find(disjointed set)数据结构实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-12
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多