bratosabra
Мастер
(1156)
1 неделю назад
from collections import defaultdict
import heapq
class Graph:
def __init__(self):
self.graph = defaultdict(list)
def add_edge(self, u, v, weight, start_time, end_time):
self.graph[u].append((v, weight, start_time, end_time))
def dijkstra(graph, start, end, current_time):
distances = {node: float('inf') for node in graph}
distances[start] = 0
pq = [(0, start)] # (distance, node)
while pq:
(dist, current) = heapq.heappop(pq)
if current == end:
return dist
for neighbor, weight, start_time, end_time in graph[current]:
if current_time + weight <= end_time and dist + weight < distances[neighbor]:
distances[neighbor] = dist + weight
heapq.heappush(pq, (distances[neighbor], neighbor))
return -1 # Путь не найден
# Пример использования
if __name__ == "__main__":
n, m = map(int, input().split())
graph = Graph()
for _ in range(m):
u, v, weight, start_time, end_time = map(int, input().split())
graph.add_edge(u, v, weight, start_time, end_time)
start_time = 0
start = 1
end = n
result = dijkstra(graph, start, end, start_time)
if result == -1:
print("Маршрут не найден")
else:
print(result)
Rost Yakshtas
Ученик
(143)
1 неделю назад
import heapq
from collections import defaultdict
def find_shortest_path(N, M, edges):
# Граф в формате adj_list
graph = defaultdict(list)
for u, v, length, start, end in edges:
graph[u].append((v, length, start, end))
# Очередь для алгоритма Дейкстры: (текущее время, точка)
pq = [(0, 1)] # Время и начальная точка
dist = {i: float('inf') for i in range(1, N + 1)} # Минимальное время до каждой точки
dist[1] = 0 # Начальная точка
while pq:
current_time, current_node = heapq.heappop(pq)
# Если достигли точки N, возвращаем результат
if current_node == N:
return current_time
# Если текущее время больше известного минимального, пропускаем
if current_time > dist[current_node]:
continue
# Проверяем все соседние узлы
for neighbor, length, start, end in graph[current_node]:
# Можно ли использовать путь в данный момент времени
if current_time < start:
next_time = start + length # Ждем до начала активности пути
elif start <= current_time <= end:
next_time = current_time + length
else:
continue # Путь недоступен
# Если нашли более быстрый путь, обновляем и добавляем в очередь
if next_time < dist[neighbor]:
dist[neighbor] = next_time
heapq.heappush(pq, (next_time, neighbor))
return "Маршрут не найден" # Если очередь пуста и точка N не достигнута
# Ввод данных
def main():
N, M = map(int, input().split())
edges = []
for _ in range(M):
u, v, length, start, end = map(int, input().split())
edges.append((u, v, length, start, end))
print(find_shortest_path(N, M, edges))
# Пример использования
if __name__ == "__main__":
main()
«Оптимизация дневного маршрута»
Проблема:
В городе есть N точек и M дорог, соединяющих их. Каждый путь имеет продолжительность и может использоваться только в течение определенного периода времени (время активности пути). Ваша цель — найти маршрут из точки 1 в точку N за минимальное время. Невозможно найти маршрут, не учитывая временные ограничения.
Вход:
Программа принимает данные в следующем формате:
В первой строке даны N (количество точек) и M (количество путей) (2≤N≤104, 1≤M≤5×104. В следующей M строке дано по пять чисел для каждого). путь: u,v — начало и конец пути ( 1≤u,v≤N) часы запускаются в момент времени T (0≤T≤106).
Поднимитесь:
Рассчитайте общее время, необходимое для прохождения маршрута за минимальное время. Если маршрут не существует, выдайте сообщение «Маршрут не найден».
Пример: Ввод:
5 6
1 2 4 0 10
2 3 3 5 15
3 5 6 10 20
1 4 8 0 10
4 5 2 8 12
2 5 7 5 25
0
Вывод:
15
Объяснение:
Маршрут: 1→2→3→5. Длина дорог 4+3+6=15.
Вход:
3 2
1 2 5 0 10
2 3 10 20 30
0
Вывод:
Маршрут не найден