Этот пример демонстрирует использование импортированных модулей в Delphi. Показано обращение к модулю, создание, применение и передача динамических массивов. Файлы расположены в каталоге Samples\Delphi.
Параметры процедуры FloidSearchPath N - число вершин в графе. W - array [1..N,1..N] of Real. W[I,J] - вес ребра, идущего из I в J. Граф может быть несимметричен. W[I,I]=0 для всех I. S - результат работы. True, если алгоритм сработал успешно, False если найден контур с суммарным отрицательным весом. D - array [1..N,1..N] of Real. D[I,J] - стоимость минимального пути из I в J. P - array [1..N,1..N] of Real. P[I,J] - номер предпоследней вершины в пути из I в J.
FloidUnit.Pas
unit FloidUnit;
interface
uses Math, Ap, Arrays1D, Arrays2D;
procedure FloidSearchPath(N : Integer; W : TReal2DArray; var S : Boolean; var D : TReal2DArray; var P : TInteger2DArray);
implementation
procedure FloidSearchPath(N : Integer; W : TReal2DArray; var S : Boolean; var D : TReal2DArray; var P : TInteger2DArray);
var
I : Integer;
J : Integer;
M : Integer;
A : Double;
label __Finalizing;
begin
//Initializers
W := TReal2DArray.Create(W);
//Body
D.SetBounds(1 , N , 1 , N);
P.SetBounds(1 , N , 1 , N);
i := 1;
repeat
j := 1;
repeat
p[i,j] := i;
d[i,j] := w[i,j];
j := j+1;
until not (j<=n);
i := i+1;
until not (i<=n);
m := 1;
s := True;
repeat
i := 1;
repeat
j := 1;
repeat
a := W[i,m]+W[m,j];
if a<w[i,j] then
begin
if i=j then
begin
s := False;
end
else
begin
d[i,j] := a;
p[i,j] := p[m,j];
end;
end;
j := j+1;
until not ((j<=n) and s);
i := i+1;
until not ((i<=n) and s);
i := 1;
repeat
j := 1;
repeat
W[i,j] := D[i,j];
j := j+1;
until not (j<=n);
i := i+1;
until not (i<=n);
m := m+1;
until not ((m<=n) and S);
//Finalizers
__Finalizing:
W.Destroy;
end;
end.
Sample1.Dpr
program Sample1;
{$APPTYPE CONSOLE}
uses
SysUtils,
FloidUnit in 'FloidUnit.pas',
Math,
Ap,
Arrays1D,
Arrays2D;
var
N : Integer;
W : TReal2DArray;
S : Boolean;
D : TReal2DArray;
P : TInteger2DArray;
I : Integer;
J : Integer;
T : Double;
First, Last : Integer;
begin
W := TReal2DArray.Create;
D := TReal2DArray.Create;
P := TInteger2DArray.Create;
//установка размеров
Write ( 'Enter N ' );
ReadLn( N );
if N<2 then
begin
WriteLn( 'Wrong N');
ReadLn;
Exit;
end;
W.SetBounds(1, N, 1, N);
D.SetBounds(1, N, 1, N);
P.SetBounds(1, N, 1, N);
//ввод массива
for I:=1 to N do
W[I,I] := 0;
for I:=1 to N do
for J:=1 to N do
if J>I then
begin
Write( 'W[', I, ' , ', J, ' ] = ');
ReadLn( T );
W[I,J] := T;
W[J,I] := T;
end;
//расчёт
FloidSearchPath(N, W, S, D, P);
if not S then
begin
WriteLn( 'Wrong matrix' );
ReadLn;
Exit;
end;
//вывод указанного пути
Write( 'First = ');
ReadLn( First );
Write( 'Last = ');
ReadLn( Last );
if (First<1) or (First>N) or (Last<1) or (Last>N) then
begin
WriteLn( 'Wrong first or last points');
ReadLn;
Exit;
end;
WriteLn( First );
repeat
WriteLn( P[Last, First] );
First := P[Last, First];
until First=Last;
ReadLn;
W.Free;
D.Free;
P.Free;
end.