Умение решать алгоритмические задачи, связанные с анализом графов (задачи построения оптимального пути между вершинами графа, определения количества различных путей между вершинами ориентированного ациклического графа) · 26 заданий
- Задание №23№23
Тариф «Подготовка»
Графы
- Задание №23№23
Тариф «Подготовка»
Графы
- Задание №23№23
Тариф «Подготовка»
Графы
- Задание №23№23
Тариф «Подготовка»
Графы
- Задание №23№23
Тариф «Подготовка»
Графы
- Задание №23№23
Тариф «Подготовка»
Графы
- Задание №23№23
Тариф «Подготовка»
Графы
- Задание №23№23
Тариф «Подготовка»
Графы
- Задание №23№23
Тариф «Подготовка»
Графы
- Задание №23№23
Тариф «Подготовка»
Графы
- Задание №23№23
Тариф «Подготовка»
Графы
- Задание №23№23
Тариф «Подготовка»
Графы
В текстовом файле содержится описание ациклического ориентированного взвешенного графа. В каждой строке файла записаны два натуральных числа (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.
Типовой пример имеет иллюстративный характер. Для выполнения задания используйте данные из прилагаемого файла.
2027002230_23.txtПравильный ответ
10971
Пояснение
Решение.
Граф ориентированный и ациклический, веса рёбер положительны, поэтому кратчайший путь ищется алгоритмом Дейкстры (или динамикой по вершинам в топологическом порядке).
Программа читает файл построчно, разбивая каждую строку по пробельным символам: первые два числа — номера вершин, третье — вес ребра. Рёбра складываются в список смежности, после чего от вершины 1 запускается поиск кратчайших расстояний, а из ответа берётся целая часть расстояния до вершины 100.
import heapq
edges = {}
for line in open('23.txt'):
parts = line.split()
if len(parts) != 3:
continue
a, b, w = int(parts[0]), int(parts[1]), float(parts[2])
edges.setdefault(a, []).append((b, w))
dist = {1: 0.0}
queue = [(0.0, 1)]
while queue:
d, u = heapq.heappop(queue)
if d > dist.get(u, float('inf')):
continue
for v, w in edges.get(u, []):
if d + w < dist.get(v, float('inf')):
dist[v] = d + w
heapq.heappush(queue, (dist[v], v))
print(int(dist[100]))
Программа печатает 10971.
Ответ: 10971