В текстовом файле содержится описание ациклического ориентированного взвешенного графа.
В каждой строке файла записаны два натуральных числа (L, M) и одно положительное вещественное число (W). L и M — номера вершин графа, W — вес ребра, ведущего из вершины L в вершину M. Таким образом, количество строк в файле равно количеству рёбер в графе. Две вершины графа не могут быть соединены более чем одним ребром.
Найдите и запишите в ответе целую часть длины кратчайшего пути из вершины с номером 1 в вершину с номером 100. Существование хотя бы одного такого пути гарантируется. Под длиной кратчайшего пути понимается минимальная сумма весов рёбер, составляющих путь.
Для выполнения этого задания следует написать программу.
Вершины графа могут быть пронумерованы не подряд. L ≤ 1000, M ≤ 1000; W ≤ 10 000. Количество строк в файле не превосходит 200. Числа в строках разделены произвольным ненулевым количеством пробелов и/или табуляций.
Типовой пример организации данных во входном файле для графа на рисунке
100 12 1.0
6 7 7.0
6 1 1.0
1 7 5.5
7 100 2.0
4 100 8.0
1 100 12.0
1 4 2.5
Для приведённого примера верным ответом будет 7.
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемого файла.
Граф всех возможных путей (жёлтым цветом выделен нужный путь, проходящий через нужные вершины):
Приведём решение на языке Python.
from functools import lru_cache
import sys
# Увеличим лимит рекурсии на случай большого количества вершин
sys.setrecursionlimit(10000)
# 1. Считываем данные и строим список смежности графа
graph = {}
# Замените '23.txt' на имя вашего файла с данными
with open('demo_23.txt') as f:
for line in f:
if line.strip():
# Разделяем строку по пробелам/табуляциям
parts = line.split()
u, v, w = int(parts[0]), int(parts[1]), float(parts[2])
if u not in graph:
graph[u] = []
graph[u].append((v, w))
# 2. Рекурсивная функция для поиска кратчайшего пути
@lru_cache(None)
def get_min_path(start, end):
if start == end:
return 0
if start not in graph:
return 0
min_dist = float('inf')
for neighbor, weight in graph[start]:
dist = weight + get_min_path(neighbor, end)
if dist < min_dist:
min_dist = dist
return min_dist
# 3. Вычисляем ответ
result = get_min_path(1, 100)
print("Целая часть длины кратчайшего пути:", int(result))
Ответ: 10971.

