Кажется, у меня возникли проблемы с пониманием того, как работает жадная стратегия и как алгоритм Дейкстры отслеживает кратчайший путь.Для справки приведем псевдокод алгоритма Дейкстры
DijkstrasAlgorithm(G, w, s)
InitalizeSingleSource(G, s)
S = 0
Q = G.V
while Q != 0
u = ExtractMin(Q)
S = S∪{u}
for each vertex v ∈ G.Adj[u]
Relax(u, v, w)
Пожалуйста, рассмотрите следующий весовой график направления.
Есть 5 вершин: s, t, x, y, z.10 ребер:
s->t = 3
s->y = 5
t->y = 2
t->x = 6
y->t = 1
y->x = 4
y->z = 6
x->z = 2
z->x = 7
z->s = 3
Наша цель - найти кратчайший путь от s до x.Мой ответ был s-> t-> y-> x с длиной 9, я предположил, что "S" в псевдокоде был кратчайшим путем и что каждый ExtractMin из minQ был добавлен в путь.
MyУчитель, однако, сказал мне, что это неправильно.Правильный ответ s-> t-> x с длиной 9. Разница в нашем ответе состоит в том, включать ли y.Мой учитель говорит, что, поскольку s-> t-> x «найден первым», он не обновляется до s-> t-> y-> x, равной длины.
Это смущает меня.Алгоритм Дейкстры использует жадную стратегию, и я думал, что жадная стратегия заключалась в том, чтобы всегда выбирать кратчайший путь, доступный в то время.И когда выбор между t-> y и t-> x, t-> y короче и поэтому должен быть выбран.
Мои вопросы:
1) При каких обстоятельствахразве жадная стратегия не выберет ближайший кратчайший путь для конечного результата?
2) Если использование ExtractMin в minQ не то, как мы отслеживаем общий путь от s до x, то как мы будем отслеживатьполного пути?