Статья Автор: Деникина Н.В., Деникин А.В.

Демо-вариант

Условие задачи из демо-варианта

В текстовом файле содержится описание ациклического ориентированного взвешенного графа. В каждой строке файла записаны два натуральных (L, M) и одно положительное (W) вещественное число. L и M – номера вершин графа, W – вес ребра, ведущего из вершины L в M. Таким образом, количество строк в файле равно количеству рёбер в графе. Две вершины графа не могут быть соединены более чем одним ребром.

Найдите и запишите в ответе целую часть длины кратчайшего пути из вершины с номером 1 в вершину с номером 100. Существование хотя бы одного такого пути гарантируется. Под длиной кратчайшего пути понимается минимальная сумма весов рёбер, составляющих путь.

Для выполнения этого задания следует написать программу.

Вершины графа могут быть пронумерованы не подряд. Значения L и M не превосходят 1000. Значение W не превосходит 10 000. Количество строк в файле не превосходит 200.

Числа в строках разделены произвольным ненулевым количеством пробелов и/или табуляций.

Что на самом деле дано в задаче

Перед нами не нарисованный граф, а текстовый файл. Каждая строка файла задаёт одно ориентированное ребро:

L M W

Это означает: из вершины L можно перейти в вершину M, а вес этого ребра равен W.

Значит, перед решением задачи нужно мысленно заменить файл на граф:

файл → список рёбер → ориентированный ациклический граф → поиск кратчайшего пути 1 → 100.

На экзамене рисунка графа нет. Граф нужно восстановить из файла непосредственно в программе.


Разбор условия

Ориентированный

Рёбра односторонние. Порядок чисел в строке задаёт направление, а не «первое и второе».

Взвешенный

У рёбер есть веса, и длина пути — их сумма.

Ациклический

Стрелки не образуют кольца: вернуться в вершину, из которой вышел, нельзя. Отсюда два следствия — путей конечное число, и вопрос про самый длинный путь тоже имеет смысл.

Остальное в условии — про файл: номера вершин до 1000 и не подряд, вес до 10 000, строк не больше 200, разделители — любые пробелы и табуляции. Эти четыре числа определят, как мы будем хранить граф.


Пример из условия


7.0 1.0 5.5 2.0 12.0 2.5 8.0 1.0 6 7 1 4 100 12 Кратчайший путь 1 → 7 → 100: 5.5 + 2.0 = 7.5

Вершин мало, поэтому можно просто выписать все пути из 1 в 100:

  • 1 → 100: 12.0
  • 1 → 7 → 100: 5.5 + 2.0 = 7.5
  • 1 → 4 → 100: 2.5 + 8.0 = 10.5

Минимум — 7.5. В ответе целая часть: 7.

Целая часть — не округление. 7.5 превращается в 7, а не в 8.

Вершина 12 в файле есть, но стоит после 100 и в путь не попадает. Лишние вершины в файле — норма.

Ручками решить не всегда получится

Каждая развилка умножает число путей. На сорока рёбрах их уже сотни, на двухстах — миллионы, и выписывать бесполезно. Решать нужно программным путём.

Где какая строка

Слева файл целиком, справа граф. Шагай стрелками или нажми «показать всё» — строка за строкой граф нарисуется сам.


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
1.07.01.05.52.08.012.02.5100126714строка 1: рисуем стрелку из 100 в 12 весом 1.0строка 2: рисуем стрелку из 6 в 7 весом 7.0строка 3: рисуем стрелку из 6 в 1 весом 1.0строка 4: рисуем стрелку из 1 в 7 весом 5.5строка 5: рисуем стрелку из 7 в 100 весом 2.0строка 6: рисуем стрелку из 4 в 100 весом 8.0строка 7: рисуем стрелку из 1 в 100 весом 12.0строка 8: рисуем стрелку из 1 в 4 весом 2.5Восемь строк файла — восемь стрелок. Граф готов.

Стрелками — по одному шагу, кнопка «показать всё» прогоняет целиком. Строки файла идут вразнобой: сначала появляется стрелка из 100, а сама вершина 1 — только на третьей строке. Это нормально.


Ловушки

  • Пошли по ребру в обратную сторону. Направление задано порядком чисел.
  • Сложили количество рёбер вместо весов.
  • Округлили 7.5 до 8. Нужна целая часть.
  • Искали путь до вершины с самым большим номером. Финиш всегда назван в условии.
  • Решили, что вершины идут подряд. Номера произвольные, до 1000.

Проверь себя


По графу из условия отметьте, что верно.

Целая часть длины кратчайшего пути из вершины 6 в вершину 100.

Целая часть длины самого длинного пути из вершины 1 в вершину 12.
Печать