program min_road;
const
N=7;{ количество вершин графа}
var
map:array[1..N,1..N] of integer;{ Карта: map[i,j] не 0,
если точки i и j соединены }
road:array[1..N] of integer;{ Маршрут - номера точек карты }
incl:array[1..N] of boolean;{ incl[i]=TRUE, если точка )
{ с номером i включена в road }
len:integer;{ Длина последнего найденного маршрута }
c_len:integer;{ Длина текущего маршрута }
start,finish:integer;{ Начальная и конечная точки }
i,j:integer;
procedure step(s,f,p:integer);
var
c:integer;{ Номер точки,в которую делаем очередной шаг }
begin
if s=f then
begin
len:=c_len;{ сохраним длину найденного маршрута }
write('Путь: ');
for i:=1 to p-1 do write(road[i],' ');
writeln(' Длина: ',len);
end
else
{ выбираем очередную точку }
for c:=1 to N do { Проверяем все вершины }
if(map[s,c]<>0) AND (NOT incl[c]) AND((len=0) OR (c_len+map[s,c]<len))
{ Точка соединена с текущейне включена в маршрут}
then begin
road[p]:=c;{ Добавим вершину в путь }
incl[c]:=TRUE;{ Пометим вершину }
{ как включенную }
c_len:=c_len+map[s,c];
step(c,f,p+1);
incl[c]:=FALSE;
road[p]:=0;
c_len:=c_len-map[s,c];
end;
end;{ Конец процедуры step }
{ Основная программа }
begin
{ Инициализация массивов }
for i:=1 to N do road[i]:=0;
for i:=1 to N do incl[i]:=FALSE;
for i:=1 to N do for j:=1 to N do map[i,j]:=0;
{ Ввод значений элементов карты }
map[1,2]:=1; map[2,1]:=1;
map[1,3]:=1; map[3,1]:=1;
map[1,4]:=1; map[4,1]:=1;
map[3,4]:=1; map[4,3]:=1;
map[3,7]:=1; map[7,3]:=1;
map[4,6]:=1; map[6,4]:=1;
map[5,6]:=1; map[6,5]:=1;
map[5,7]:=1; map[7,5]:=1;
map[6,7]:=1; map[7,6]:=1;
write('Введите через пробел номера начальной и конечной точек -> ');
readln(start,finish);
road[1]:=start;{ Внесем точку в маршрут }
incl[start]:=TRUE;{ Пометим ее как включенную }
len:=0;
c_len:=0;
step(start,finish,2);{Ищем вторую точку }
writeln('Для завершения нажмите <Enter>');
readln;
end.