Алгоритм Dijkstra с ячейками повышения скоростиC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Алгоритм Dijkstra с ячейками повышения скорости

Сообщение Anonymous »

Trying to solve problem Ace Race in codeforces
Given a racetrack with N nodes starting from 1 to N
For a normal node, x, it is possible to move to x - 1 or x + 1 in 2 seconds (for x = 1 then only x = 2 is possible to travel and similarly with x = N only x = N - 1)
The racetrack contains some powerup Узлы которого могут быть узлом для прыжков или узлом повышения скорости < /p>
узлы повышения скорости, позволяющие перемещаться между узлами за 1 секунду в течение K, в то время как узлы Prump Pad дают вам возможность перемещаться в определенную ячейку V в течение 1 секунды. < /p>
повышение скорости скорости не складывается; Вместо этого, многочисленные повышения скорости могут быть активными в одно и то же время, что означает, что вы можете сохранить максимум между оставшейся продолжительностью повышения скорости и текущим повышением скорости узла.
Кроме того, активация накладки для прыжков деактивирует любой ток. Когда дело доходит до узела скорости повышения с индексом j, постройте ребра от j до всех ячеек g в [j - k, j + k] с весом, равным G - J, за исключением узла g = j i пропускаю его. Таким образом, я могу расслабить узлы, которые связаны с скоростной ячейкой непосредственно непосредственно. Код: < /p>
Моя реализация алгоритма Dijkstra < /p>
#include
#include

int dijkstra(int n,
std::unordered_map& adj_list){

std::unordered_map times;
times[1] = 0;

std::unordered_set explored = {1};

int calc_time;
int i = 1;
while(i < n){
for(const auto& [neighbor, weight]: adj_list){
if(explored.count(neighbor)){
continue;
}

calc_time = times + weight;
if(!times.count(neighbor)){
times[neighbor] = calc_time;
} else {
times[neighbor] = std::min(times[neighbor], calc_time);
}
}

times.erase(i);

int min_val = -1;
int min_key = 0;
for(const auto& [key, value]: times){
if(min_val == -1){
min_val = value;
min_key = key;
continue;
}
if(value < min_val){
min_val = value;
min_key = key;
}
if(min_val == i + 1){
break;
}
}

i = min_key;
explored.insert(i);
}

return times[n];
}
< /code>
Обработка ввода и создание Adj_list < /p>
#include
int main() {
int n;
std::cin >> n;
std::unordered_map adj_list;

for(int i = 1; i 1) adj_list = 2;
if(i < n) adj_list[i + 1] = 2;
}

char cur_cell;
int value;
for(int i = 1; i > cur_cell;

if(cur_cell == 'S'){
std::cin >> value;
int start = std::max(1, i - value);
int end = std::min(n, i + value);
for(int j = start; j > value;
adj_list[value] = 1;
}
}

int answer = dijkstra(n, adj_list);
std::cout

Подробнее здесь: https://stackoverflow.com/questions/797 ... oost-cells
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»