Светофоры для людей и светофоры для авто.Люди могут переходить дорогу только по переходам.Нумеруем переходы от 1 до 4.Углы перекрёстка имеют комбинации 12,23,34 и 41 по номерам переходов, которыми можно пользоваться, находясь на этом углу.Для каждого перехода известно время RJ,в течение которого людям горит красный свет,и время GJ,в течение которого людям горит зелёный свет J=1,2,3,4.Для каждого перехода известно время TJ,за которое его можно пройти.Проходим дорогу в том случае,если успеем перейти её на зелёный свет.Чтобы перейти дорогу нужно перейти с угла 12 на угол Y≢12.Создать код для определения меньшего время для перемещения на угол Y.
python
import heapq
def find_min_time(traffic_lights, junctions):
# Создаем словарь, содержащий информацию о времени горения светофоров на каждом переходе
lights_dict = {}
for i, (rj, gj) in enumerate(traffic_lights):
lights_dict[i+1] = (rj, gj)
# Создаем словарь, содержащий информацию о времени прохождения каждого перехода
junctions_dict = {}
for i, tj in enumerate(junctions):
junctions_dict[i+1] = tj
# Создаем граф, состоящий из узлов соединенных ребрами и весами, равными времени для перемещения от одного узла к другому
graph = {
1: [(2, junctions_dict[1]), (4, junctions_dict[4])],
2: [(1, junctions_dict[2]), (3, junctions_dict[2])],
3: [(2, junctions_dict[3]), (4, junctions_dict[3])],
4: [(1, junctions_dict[4]), (3, junctions_dict[4])]
}
# Создаем словарь, содержащий информацию о текущем расстоянии от узла 12 до каждого другого узла
distances = {node: float('inf') for node in graph}
distances[1] = 0
# Создаем словарь, содержащий информацию о номере перехода, с помощью которого можно переместиться на данный узел
junction_nums = {1: None}
# Создаем очередь с приоритетами для выбора узла с наименьшим текущим расстоянием
pq = [(0, 1)]
while pq:
current_dist, current_node = heapq.heappop(pq)
# Проверяем, если текущий узел является углом Y, то его расстояние записываем как минимальное время для перемещения на угол Y
if current_node == Y:
min_time = current_dist
break
# Проверяем соседние узлы текущего узла
for neighbor, weight in graph[current_node]:
neighbor_dist = current_dist + weight
# Проверяем, если временная переменная меньше текущего расстояния соседнего узла, то обновляем его текущее расстояние
if neighbor_dist < distances[neighbor]:
distances[neighbor] = neighbor_dist
heapq.heappush(pq, (neighbor_dist, neighbor))
# Записываем номер перехода, с помощью которого можно переместиться на данный узел
junction_nums[neighbor] = current_node
# Возвращаем минимальное время для перемещения на угол Y и номера переходов, которые нужно использовать для перемещения на угол Y
return min_time, get_junctions(junction_nums, Y)
def get_junctions(junction_nums, Y):
# Функция для получения номеров переходов, которые нужно использовать для перемещения на угол Y
junctions = []
current_junction = Y
while current_junction != 1:
junctions.append(current_junction)
current_junction = junction_nums[current_junction]
# Переворачиваем список, чтобы получить порядок прохождения переходов от угла 12 к углу Y
junctions.reverse()
return junctions
# Пример использования:
traffic_lights = [(5, 10), (8, 12), (7, 15), (9, 11)]
junctions = [3, 7, 5, 4]
Y = 4
min_time, junctions_used = find_min_time(traffic_lights, junctions)
print("Минимальное время для перемещения на угол Y:", min_time)
print("Переходы, которые нужно использовать для перемещения на угол Y:", junctions_used)
В данном примере будет найдено минимальное время для перемещения от угла 12 к углу 4, а также будут предоставлены номера переходов, которые необходимо использовать для перемещения на угол 4.Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет
Нажимая «Регистрация» или «Войти через Google», вы соглашаетесь с Публичной офертой, даете Согласие на обработку персональных данных, а также подтверждаете что вам есть 18 лет