Похоже, вы выбираете кратчайший путь из того места, где вы сейчас находитесь, и не рассчитываете общее расстояние, чтобы добраться до узла. Давайте подробно рассмотрим это.
Алгоритм Дейкстры устанавливает два набора узлов: посещенные (с известными расстояниями) и непосещенные (с предварительными расстояниями). Мы начинаем с:
visited: { }
unvisited: { a(dist 0), b(dist ∞), c(dist ∞), d(dist ∞), e(dist ∞), f(dist ∞) }
Наименьшее предварительное расстояние становится постоянным, и этот узел является «текущим» узлом. Используя текущий узел, мы обновляем предварительные расстояния, которые текущий узел может достичь на более коротком расстоянии, и помечаем текущий узел как посещенный:
visited: { a(0) }
unvisited: { b(26), c(50), d(∞), e(∞), f(∞) }
Мы повторяем приведенный выше абзац, делая кратчайшее предварительное расстояние постоянным и обновляя ориентировочные расстояния, которые текущий узел может достичь на более коротком расстоянии, и помечаем текущий узел как посещенный:
visited: { a(0), b(26) }
unvisited: { c(50), d(91), e(∞), f(∞) }
И опять:
visited: { a(0), b(26), c(50) }
unvisited: { d(91), e(76), f(∞) }
На этот раз мы выбираем e в качестве текущего узла, потому что его ориентировочное расстояние меньше, чем d. Но предварительное расстояние d не обновляется, потому что мы уже нашли лучшее расстояние. Марк e посетил:
visited: { a(0), b(26), c(50), e(76) }
unvisited: { d(91), f(101) }
Теперь d является текущим, но никакие расстояния он не обновляет (нам не нужно смотреть на посещенные узлы, мы уже нашли там лучшие расстояния). Поэтому мы просто отмечаем его как посещенный:
visited: { a(0), b(26), c(50), e(76), d(91) }
unvisited: { f(101) }
Теперь f является текущим, что означает, что мы закончили.
person
Teepeemm
schedule
21.06.2015