Nadesłany przez Michał Knasiecki, 09 sierpnia 2005 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
ford_d/Unit1.pas:
//Program pobrany ze strony www.algorytm.org
//Algorytm Forda-Bellmana
//Opracowal Michal Knasiecki
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,math;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Memo1: TMemo;
OpenDialog1: TOpenDialog;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
plik:textfile;
n:integer=0;//liczba wierzchołków w grafie
D:array[1..100] of integer;//Wektor odległości od wierzchołka 1 do pozostałych
A:array[1..100,1..100]of integer;//Macierz wag krawędzi
TMP:integer;
const
nieskonczonosc=100000;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
i,j:integer;
begin
if opendialog1.execute then
begin
assignfile(plik,opendialog1.filename);
reset(plik);
readln(plik,n);
for j:=1 to n do
for i:=1 to n do
begin
readln(plik,s);
if s<>'*' then
A[j,i]:=strtoint(s) else A[j,i]:=nieskonczonosc;
end;
closefile(plik);
memo1.lines.add('Liczba wierzchołków: '+inttostr(n));
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer;
k:integer;
begin
if n=0 then showmessage('Musisz wczytać graf z pliku!') else
begin
//Przyjmujemy, że s=1, szukamy więc najkrótszych dróg od wierzchołka 1 do pozostałych
for i:=1 to n do D[i]:=A[1,i];
for k:=1 to n-2 do
begin
for i:=2 to n do //Pomijamy pierwszy wierzchołek, gdyż D(1)=0
for j:=1 to n do
begin
if (D[j]+A[j][i]>nieskonczonosc) then
TMP:=nieskonczonosc else
TMP:=D[j]+A[j][i];
D[i]:=min(D[i],TMP);
end;
end;
for i:=1 to n do
if D[i]<nieskonczonosc then
memo1.lines.add('D('+inttostr(i)+')='+inttostr(D[i]))else //wypisujemy wynik
memo1.lines.add('D('+inttostr(i)+')='+'*')
end;
end;
end.

