去吧,Dijkstra:打印出路径,而不仅仅是计算最短的距离。
http://play.golang.org/p/A2jnzKcbWD
我使用Dijkstra算法能够找到最短的距离,也许不是。可以在这里找到代码。
但是,如果我无法打印出路径,那将毫无用处。随着大量指针的出现,我无法弄清楚如何打印出权重最少的最终路径。
简而言之,我不仅要找到最短的距离,还要在给定的代码上打印出最短的路径?
链接在这里:
代码片段如下:
const MAXWEIGHT = 1000000 type MinDistanceFromSource map[*Vertex]int func (G *Graph) Dijks(StartSource, TargetSource *Vertex) MinDistanceFromSource { D := make(MinDistanceFromSource) for _, vertex := range G.VertexArray { D[vertex] = MAXWEIGHT } D[StartSource] = 0 for edge := range StartSource.GetAdEdg() { D[edge.Destination] = edge.Weight } CalculateD(StartSource, TargetSource, D) return D } func CalculateD(StartSource, TargetSource *Vertex, D MinDistanceFromSource) { for edge := range StartSource.GetAdEdg() { if D[edge.Destination] > D[edge.Source]+edge.Weight { D[edge.Destination] = D[edge.Source] + edge.Weight } else if D[edge.Destination] < D[edge.Source]+edge.Weight { continue } CalculateD(edge.Destination, TargetSource, D) } }
我对数组做了一些操作,以查看正在更新的内容。
http://play.golang.org/p/bRXYjnIGxy
这给ms
[A->D D->E E->F F->T B->E E->D E->F F->T]
当您在此处调整新路径距离时
if D[edge.Destination] > D[edge.Source]+edge.Weight { D[edge.Destination] = D[edge.Source] + edge.Weight
设置一些数组元素(例如,P对于“ parent”)以指出您Destination来自Source。
P
Destination
Source
P[edge.Destination] = edge.Source
算法结束后,在此数组中,每个顶点将在从起始顶点开始的路径上具有其前身。
PS。好的,不适合数组和索引…
Prev在“顶点”中添加一个新字段:
Prev
type Vertex struct { Id string Visited bool AdjEdge []*Edge Prev *Vertex }
调整距离时:
if D[edge.Destination] > D[edge.Source]+edge.Weight { D[edge.Destination] = D[edge.Source] + edge.Weight edge.Destination.Prev = edge.Source
当您显示结果时:
for vertex1, distance1 := range distmap1 { fmt.Println(vertex1.Id, "=", distance1) if vertex1.Prev != nil { fmt.Println (vertex1.Id, " -> ", vertex1.Prev.Id) } }