end;
{ Процедура расширения (экспансии) "империи", начиная с заданного узла arg }
procedure Expand(arg : PNode);
{ Взять из P_58_1,
выделенные там операторы для трассировочной распечатки удалить }
end;
{ Функция для формирования пути от центра империи к заданному узлу }
function MakePath(arg : PNode): string;
var p : PNode;
S : string;
begin
S:= arg^.mName; { имя конечного узла }
p:= arg^.mPrev; { указатель на предыдущий узел }
while Assigned(p) do begin { пока не достигли корня }
S:= p^.mName +' -> '+ S; { добавляем к пути имя узла }
p:= p^.mPrev; { переход к следующему узлу }
end;
MakePath:= S;
end;
var F_In {, F_Out} : Text; { входной и выходной файла }
C1, C2 : Char; { названия стран "откуда" и "куда" }
Start, Stop : PNode; { узлы "откуда" и "куда" }
begin {--- Главная программа ---}
{ Инициализация списка узлов и очереди узлов }
List:= nil; Que:= nil;
Assign(F_In, 'P_57_1.in');
ReadData(F_In); { чтение графа }
{ Цикл ввода названий стран }
repeat
Write('Откуда= '); Readln(C1);
C1:= UpCase(C1);
if not (C1 in ['A'..'Z']) then break;
Write('Куда = '); Readln(C2);
C2:= UpCase(C2);
if not (C2 in ['A'..'Z']) then break;
Start:= GetPtr(C1); { начальный узел }
Stop:= GetPtr(C2); { конечный узел }
if Assigned(Start) and Assigned(Stop) then begin
{ если такие страны существуют, }
InitList; { устанавливаем начальные значения в полях узлов }
Expand(Start); { расширяем "империю" от узла Start }
Writeln (Stop^.mDist:3, ’’:3, MakePath(Stop));
end;
until false
end.