Добрался Иван-царевич до болот, тут они с волком и простились. Пригляделся Иван-царевич, и стрелу свою увидел: торчит она в самой дальней кочке. Ну что ж, делать нечего, придется прыгать с кочки на кочку, чтобы до нее добраться.
Ваша задача - определить наиболее короткий маршрут до стрелы.
Формат входного файла input.txt
Первая строка - целое число N (1 <= N <= 500) - количество кочек на болоте.
Далее следуют N строк, описывающие кочки. Строка № j+1 (j = 1, 2, …, N) содержит 0 или более пар, состоящих из целого числа Pk (1 <= Pk <= N, j < k < N) и вещественного числа Qk (0,001 <= Qk <= 1000, j < k < N) через пробел (пары также разделены пробелами). Целое число Pk (первое в паре) - номер кочки, вещественное число Qk - расстояние от кочки № j до кочки № Pk. Каждая из N строк завершается парой 0 0.
При этом первая строка описывает кочку, на которую Иван-царевич встает первой, а последняя - кочку, до которой и нужно добраться.
Обратите внимание, что во входном файле указаны расстояния только между такими парами кочек № j и № Pk, в которых j < Pk. Расстояние от кочки № Pk до кочки № j в точности равно расстоянию от кочки № j до кочки № Pk. Гарантируется, что путь от кочки № 1 до кочки № N всегда существует.
Примечание. Поскольку Иван-царевич может прыгнуть не далее определенного расстояния, во входном файле указаны только принципиально достижимые для него кочки, когда он стоит на кочке №j.
Формат выходного файла output.txt
Первая строка - вещественное число S с точностью до 2 знаков после запятой - минимальное расстояние, которое придется преодолеть Ивану-царевичу, добираясь до стрелы.
Пример входного файла Пример выходного файла.
3 5.10
2 4.6 3 5.1 0 0
0 0
0 0
Приведем решение автора задачи.
Const
NMax = 500;
QMin = 0.001;
QMax = 1000;
WayMax = (NMax*NMax+1)*QMax;
{это число будет служить заменой "бесконечно большого" в}
{алгоритме Дейкстры. Разумеется, возможны и другие варианты}
Type
T_Incidence_Vector = array[1..NMax] of real;
T_Incidence_Matrix = array[1..NMax] of T_Incidence_Vector;
T_Hillok = array[1..NMax] of boolean;
T_Hillok_Way = array[1..NMax] of real;
Var
fin, fout: TextFile;
IM: T_Incidence_Matrix;
S: real;
N: integer;
Procedure ReadData;
Var
P, j: integer;
Q: real;
Begin
AssignFile(fin, 'input.txt'); Reset(fin);
Readln(fin, N);
{сначала заполним матрицу }
For j := 1 to N-1 do Begin
Read(fin, P, Q);
While not((P = 0) and (Q < QMin)) do
Begin
IM[j, P] := Q;
IM[P, j] := Q; {так как граф неориентированный,}
{и матрица симметрична}
Read(fin, P, Q);
End;
Readln(fin);
End;
{последнюю строчку на всякий случай обработаем}
{отдельно - хотя в ней, если}
{следовать условию задачи, должно быть только 0 0}
Read(fin, P, Q);
While not((P = 0) and (Q < QMin)) do Begin
IM[N, P] := Q;
IM[P, N] := Q;
read(fin, P, Q);
End;
CloseFile(fin);
End;
Function min(a, b: real): real;
Begin
If a < b then result := a
else result := b;
End;
Function MinInHillokWay(const h: T_Hillok; const hw: T_Hillok_Way;
out minNum: integer): real;
Var
i, j: integer;
Begin
{ищем первую кочку вне множества; кочка № 1 в}
{него заведомо входит.}
{проверка того, что хотя бы одна кочка еще}
{есть, здесь не проводится - это задача основного цикла}
{процедуры Solution}
i := 2;
While h[i] do i := i+1;
{найденную принимаем за "потенциальный минимум"}
result := hw[i];
minNum := i;
{а теперь просматриваем оставшиеся кочки и, если найдется что-то более подходящее, обновляем значение минимума}