Поиск кратчайшего пути между двумя точками графа — Pascal(Паскаль)

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.

Leave a Comment

52 − = 44