Ограничение по времени: 1 секунда
Ограничение по памяти: 256 мегабайт
Путь Пети пролегает через перекресток. На перекрёстке есть светофоры для пешеходов и для автомобилей.
Пешеходы переходят дорогу только по пешеходным переходам. Углы перекрёстка обознаются 12, 23, 34 и 41 Для каждого перехода время RJ, в течение которого пешеходам горит красный свет, и время G, в течение которого пешеходам горит зелёный свет J = 1, 2, 3, 4). для перехода время IJ, за которое может перейти Петя. когда Петя достиг угла 12, на всех пешеходных светофорах включился красный. через какое минимальное время Петя сможет попасть на угол У?
Реши с помощью с++
cpp
#include <iostream>
#include <vector>
#include <queue>
// Количество перекрестков
const int N = 4;
// Максимальное значение времени (бесконечность)
const int INF = 1e9;
// Функция для нахождения минимального времени до нужного угла
int findMinTime(std::vector<std::vector<int>>& graph) {
// Массив для хранения минимального времени до каждого перекрестка
std::vector<int> minTimes(N, INF);
// Очередь с приоритетом для обхода перекрестков
std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<std::pair<int, int>>> pq;
// Устанавливаем минимальное время до перекрестка 12 равным 0 и добавляем его в очередь
minTimes[0] = 0;
pq.push({0, 0});
while (!pq.empty()) {
// Извлекаем перекресток с минимальным временем из очереди
int curr = pq.top().second;
pq.pop();
// Обходим соседние перекрестки
for (int next = 0; next < N; next++) {
// Проверяем, что есть дорога между перекрестками
if (graph[curr][next] != INF) {
// Вычисляем время до следующего перекрестка
int time = minTimes[curr] + graph[curr][next];
// Если новое время меньше текущего, обновляем минимальное время и добавляем перекресток в очередь
if (time < minTimes[next]) {
minTimes[next] = time;
pq.push({time, next});
}
}
}
}
// Возвращаем минимальное время до нужного угла
return minTimes[N-1];
}
int main() {
// Создаем граф с заданными временами
std::vector<std::vector<int>> graph(N, std::vector<int>(N, INF));
// Задаем время для каждого пути
graph[0][1] = 3; // перекресток 1
graph[1][2] = 4; // перекресток 2
graph[2][3] = 5; // перекресток 3
graph[3][0] = 6; // перекресток 4
// Находим минимальное время до нужного угла
int minTime = findMinTime(graph);
// Выводим результат
std::cout << "Минимальное время до угла У: " << minTime << std::endl;
return 0;
}
В данном примере граф представляется двумерным массивом `graph` размером `N x N`, где `N` - количество перекрестков. Значение `graph[i][j]` равно времени проезда по дороге между перекрестками `i` и `j`, или INF, если дороги между перекрестками нет.
Функция `findMinTime` реализует алгоритм Дейкстры для нахождения минимального времени до угла У. Она использует массив `minTimes` для хранения минимального времени до каждого перекрестка. Очередь с приоритетом `pq` используется для обхода перекрестков в порядке возрастания времени.
В основной функции `main` мы создаем граф с заданными временами и находим минимальное время до угла У, используя функцию `findMinTime`. Результат выводится на экран.
Время работы алгоритма Дейкстры зависит от количества перекрестков и количества дорог между ними. В данном случае, если количество перекрестков и дорог не очень большое, то время работы будет приемлемым.
В итоге, мы решаем задачу, находя минимальное время (кратчайший путь) от перекрестка 12 до нужного угла У, используя алгоритм Дейкстры.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет