[英]How to store a map and generate a graph with BFS in Ruby
所以我想这对于MSC中的MSC来说是一个经典的问题。
我有N元素,我也有距离。 假设我有3个具有以下距离的元素。 它是对称的,所以
A -> B == B -> A
它看起来像一个矩阵:
A, B, C,
A 0, 10, 20
B 10, 0, 30
C 20, 30, 0
我的问题是:
在这种情况下,最好的是
B -> A -> C = 30 which equals to C -> A -> B
其他情况:
A -> B -> C = 40 which equals to C -> B -> A
我的印象是BFS可能适合这个。 链接到英文文档是好的,甚至亚马逊的书籍......
数据结构的理想解决方案是邻接列表 。
邻接列表只是一个对象列表(表示图形上的顶点)。 每个对象都有一个列表,其中包含它具有相邻边的所有顶点以及相应的权重。
在ruby中,一个简单的实现可能看起来像:
vertices = {}
a = Vertex.new
b = Vertex.new
a.add(b, 10)
b.add(a, 10)
vertices[a] = a
vertices[b] = b
找到最短加权路径的算法称为Dijkstra 。
如果您希望在运行算法后获得最短路径,则可以进行回溯。 这是通过在到达时存储每个节点的(最佳)父节点来完成的。 为了做到这一点,你可以为每个被访问节点创建一个哈希值,该哈希值以最低的成本映射到导致它的节点。
完成算法后,递归回溯可能如下所示:
def traceback(parent, start, node, path)
if(start == node)
(path + start.to_s).reverse
else
path += node.to_s + " "
traceback(parent, start, parent[node], path)
end
end
我听说Dijkstra有一个算法来导航加权图。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.