一尘不染

开始,Dijkstra:打印出路径,而不仅仅是计算最短距离

go

去吧,Dijkstra:打印出路径,而不仅仅是计算最短的距离。

http://play.golang.org/p/A2jnzKcbWD

我使用Dijkstra算法能够找到最短的距离,也许不是。可以在这里找到代码。

但是,如果我无法打印出路径,那将毫无用处。随着大量指针的出现,我无法弄清楚如何打印出权重最少的最终路径。

简而言之,我不仅要找到最短的距离,还要在给定的代码上打印出最短的路径?

链接在这里:

http://play.golang.org/p/A2jnzKcbWD

代码片段如下:

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]

阅读 202

收藏
2020-07-02

共1个答案

一尘不染

当您在此处调整新路径距离时

   if D[edge.Destination] > D[edge.Source]+edge.Weight {
      D[edge.Destination] = D[edge.Source] + edge.Weight

设置一些数组元素(例如,P对于“ parent”)以指出您Destination来自Source

P[edge.Destination] = edge.Source

算法结束后,在此数组中,每个顶点将在从起始顶点开始的路径上具有其前身。

PS。好的,不适合数组和索引…

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)
    }
}
2020-07-02