Блог пользователя talgat09

Автор talgat09, 9 лет назад, По-русски

всем добрый вечер вот изучил новый алгоритм на графы и хотел порешать задачи для закрепления но вот встал на одной из задач Дейкстры который находится на сайте e-olimp.ru problems 1389 написал код но проходит только 70% буду благодарен за помощь

  • Проголосовать: нравится
  • 0
  • Проголосовать: не нравится

»
9 лет назад, # |
  Проголосовать: нравится +14 Проголосовать: не нравится

Во-первых, у тебя неправильно написана Дейкстра: нам нужно каждую итерацию доставать вершину с минимальным расстоянием до нее. Ты же вместо этого достаешь вершину с минимальным номером. Так как в сете ты хранишь пару (номер вершины, расстояние до нее), а пары сравниваются по первому параметру, а в случае равенства — по второму.

Однако даже с такой реализацией исправленное решение проходит все тесты. Видимо, потому что граф небольшой. К сожалению, я не могу оценить время работы такого алгоритма.

Во-вторых, когда ты производишь релаксацию, ты удаляешь неправильную пару:

q.erase(make_pair(to,y));

Мы обнаружили, что если пойти по такому-то ребру, мы попадем в вершину to быстрее. Так как минимальное расстояние до вершины to изменилось, нужно удалить старое расстояние и добавить новое. Т.е. было d[to], стало y, значит нужно удалить пару (d[to], to), добавить (y, to) и обновить d[to] = y.

В-третьих, у тебя различаются расстояния до вершин в сете и в массиве d, они должны быть одинаковыми.

if(d[to]>=(abs(x-t)+abs(y-x)+d[v]) && x>=t)
{
    q.erase(make_pair(to,y));
    d[to]=abs(x-t)+abs(y-x)+d[v];
    q.insert(make_pair(to,y));
}

В d[v] мы храним минимальное время, за которое можно добраться до вершины. Поэтому нужно проверить, а не будет ли быстрее добраться до вершины to этим маршрутом? Так как y — это время прибытия в вершину to, то код будет выглядить так:

if(d[to]>y && x>=t)
{
    q.erase(make_pair(d[to], to));
    q.insert(make_pair(d[to] = y, to));
}